django项目如何部署到阿里云服务器
django项目如何部署到阿里云服务器
现在我们先默认项目长这样:
你的项目名/
├── 你的项目名
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── 文件夹
│
├── static
│ ├── 文件夹
│ └── 文件夹
└── templates
├── 文件夹
└── 文件夹
阿里云服务器购买
购买云服务器的镜像推荐使用ubuntu18.04
安全组可以勾选HTTP 80端口
在阿里云上搭建项目及安装数据库
使用Git bash将本地项目文件推送到github远程仓库
- 先在github建立repository(假设起名叫abc),初始化一个readme.md
- 在本地在一个空文件夹内用Git bash将项目克隆过来
git clone https://github.com/xxx/abc
- 将本地项目推送到github:
然后拷贝你的本地原项目文件到这个abc中,之后: (将本地的仓库推送到远程的仓库)
cd abc/
git add .
git commit -m '项目上传到github'
git push origin
将github仓库导入阿里云
在阿里云实例列表中打开远程连接,进入控制台
sudo apt-get update
apt install git
git clone https://github.com/xxx/abc
到现在,项目就从github克隆到阿里云啦!
安装依赖
pip3 install django
安装数据库
sudo apt-get install mysql-server
sudo apt-get install libmysqlclient-dev
pip3 install mysqlclient
如何将本地的数据库内容导入到阿里云呢?
- 使用Navicat, 将本地是数据库 “转储SQL文件” ->"结构+数据"保存为.sql文件
- 用Navicat连接阿里云远程数据库 . **这里有三个"坑"要注意啦 !!!**见下面"mysql问题"
mysql问题
- 创建用户: 用户默认不能在其他地方登录,所以创建用户,任何地址登录
在阿里云控制台:mysql -u root -p
回车, 进入mysql
use mysql
show tables;
desc user;
grant all privileges on *.* to 'myuser'@'%' identified by '123456';
flush privileges;
select host,user from user;
(注:这里的myuser和123456可以换成你想要的用户名和密码)
然后你就可以看到:
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | myuser |
. . .
+-----------+------------------+
5 rows in set (0.00 sec)
- 端口: 阿里云3306端口没有开放, 把端口开放
实例那里, 更多->网络和安全组->安全组配置->(跳转页面)
->配置规则->(跳转页面)
->入方向->手动添加->目的:选择:MySQL(3306), 源:选择:0.0.0.0/0 ->保存
- mysql服务器的配置: 配置文件中bind-address默认只能用本地连接,所以更改
vim /etc/mysql/mysql.conf.d/mysqld.cnf
进入文件后将bind-address
一行前面加#注释掉
如何操作呢???见下:
按下键盘i,就可以进入插入模式了,如下界面左下角的INSERT,标志着进入插入模式成功.
修改内容,
按键esc退出插入模式,如下,右下角的INSERT已消失
最后保存修改并退出编辑界面: 先使用命令:wq,然后再按下enter键
Navicat测试连接阿里云Mysql
接着 重启mysql服务:
service mysql restart
然后就可以测试连接了!!!
在Navicat连接:
连接名随便起比如aliyun-mysql
主机填写你的阿里云服务器实例的公网IP
端口:3306
用户名:上面我们创建的myuser,或者当初你创建的其他名字
密码:上面我们创建的123456或者当初你创建的其他密码
然后就可以连接成功啦!
右键aliyun-mysql新建数据库~起个名字嘞,和原项目名一样吧,比如abc
点击新建的数据库abc, 运行SQL文件,选择我们之前转储的.sql文件~
修改settings.py文件
然后让我们回到阿里云控制台:
修改settings.py文件:
vim 项目名/settings.py
其中host用私有的IP地址
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': xxx',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxx',
'PORT': '3306',
}
}
ALLOWED_HOSTS = ['*'] 或者改为你想要的ip地址
运行文件时候, 报错有哪些模块没有导入,pip3 install xxx
最后:
python3 manage.py runserver 0.0.0.0:80
访问实例的公网IP地址~
可以看到你的网站啦
uwsgi和nginx的部署
wsgi: 让任意一个服务器都能搭配任意一个web框架,需要遵守wsgi的通用网关接口,就是一个协议
uwsgi: uwsgi就是实现了wsgi的web服务器,可以接受客户端的请求,并转发响应的程序。
使用uwsgi+django就可以实现一个基本的网站功能,为什么还需要nginx???
nginx:nginx是一个专业的HTTP服务器,可以作为代理服务器使用。
搭建uwsgi启动项目
-
安装uwsgi:
pip3 install uwsgi --upgrade
-
配置uwsgi.ini文件:
创建uwsgi.ini文件
创建script目录,存放配置
编辑uwsgi.ini文件内容进入到与manage.py同级的目录下 mkdir script vim uwsgi.ini 编辑内容如下:
#uwsig使用配置文件启动
[uwsgi]
#项目目录
chdir=/var/www/你的项目名
#指定项目的application
module=你的项目名.wsgi:application
#指定sock的文件路径
socket=/var/www//你的项目名/script/uwsgi.sock
#进程个数
workers=5
pidfile=/var/www/你的项目名/script/uwsgi.pid
#指定IP端口
http=0.0.0.0:8000
#指定静态文件
static-map=/static=/var/www/你的项目名/static/
#启动uwsgi的用户名和用户组
uid=www-data
gid=www-data
#启用主进程
master=true
#自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
#序列化接受的内容,如果可能的话
thunder-lock=true
#启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/var/www/bookshop/script/uwsgi.log
# 权限
chmod-socket = 666
chown-socket = www-data
现在ls看一下有什么呢?你的项目名 manage.py script uwsgi.ini ... ...
安装nginx并进行测试:apt-get install nginx
访问公网IP可以看到:
然后创建项目的配置文件,或者直接修改原nginx配置文件都可以
vim /etc/nginx/sites-available/webtest.conf
修改成如下:
server {
listen 80;
server_name django-web-你的项目名;
charset utf-8;
client_max_body_size 75M;
location / {
uwsgi_pass unix:///var/www/你的项目名/script/uwsgi.sock;
include /etc/nginx/uwsgi_params;
}
#location /media {
# alias /path/to/project/media;
#}
location /static {
alias /var/www/你的项目名/static/;
}
}
创建完配置文件后创建软连接
sudo ln -s /etc/nginx/sites-available/webtest.conf /etc/nginx/sites-enabled/webtest.conf
tips:如果在浏览器访问新配置未生效时,可以删除默认生效配置
rm /etc/nginx/sites-enabled/default
拷贝项目到/var/www这个目录
cp -r /root/你的项目名/你的项目名 /var/www/
启动uwsgi服务
uwsgi --ini uwsgi
启动nginx,重新加载配置文件
nginx -s reload
如果端口被占用了,或者说如何重新部署项目
如果遇到下面情况:(That port is already in use)
用
netstat -anp |grep 端口号
或者
sudo lsof -i:端口号
查出来是被谁占用,它的pid是什么
用下面的方法来停止
kill -9 pid
然后就可以正常访问啦