Django项目部署到云服务器
花了好长时间才搞定的,这路上到处都是坑呀
1,准备工作:
①,需要一台云服务器,我用的是腾讯的云服务器。系统:Centos 7,其实都差不多。
②,所需软件。为了避免出错,尽量使服务器上的环境跟开发环境相同。比如我在Windows上使用的是Python3.6.0,Django 1.11,数据库使用的是MySQL5.7,等等。总而言之,尽量保持环境一致,能够减少很多麻烦。
③,在服务器上安装所需的这些依赖包。不同的服务器上可能语句有些许不同。这里我已Centos为例
2,在服务器上安装Python环境
因为云服务器上自带了Python2.7,所以我们需要安装更高的版本。首相,安装依赖包
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
下载python3.6编译安装
到python官网下载https://www.python.org
下载最新版源码,使用make altinstall,如果使用make install,在系统中将会有两个不同版本的Python在/usr/bin/目录中。这将会导致很多问题,而且不好处理。
wgethttps://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
tar -xzvf Python-3.6.0.tgz -C /tmp
cd /tmp/Python-3.6.0/
把Python3.6安装到 /usr/local 目录
./configure –prefix=/usr/local
make
make altinstall
python3.6程序的执行文件:/usr/local/bin/python3.6
python3.6应用程序目录:/usr/local/lib/python3.6
pip3的执行文件:/usr/local/bin/pip3.6
pyenv3的执行文件:/usr/local/bin/pyenv-3.6
更改/usr/bin/python链接
cd/usr/bin
mv python python.backup
ln -s /usr/local/bin/python3.6 /usr/bin/python
ln -s /usr/local/bin/python3.6 /usr/bin/python3
这里我建议只需要更改Python3 的软连接就行了。不要去懂Python2.7的东西,因为系统很多依赖于Python2.7.。所以我们上面的只需要执行这句就可以 了
ln -s /usr/local/bin/python3.6 /usr/bin/python3
这样我们基本的Python环境就搭建好了。
3,创建Python虚拟环境,安装项目所需的依赖包
已我的项目举个栗子:
# 创建虚拟环境
Python3 -m venv /mysite(路径名)/
# 进入虚拟环境
cd /mysite/bin
source activate
现在就在虚拟环境里面了。
然后安装PIP,本来服务器上就自带有,可以执行下更新操作:
pip install upgrade pip
之后就比较简单了。直接通过pip install **即可,如要安装对应的版本。
pip install Django==1.11.1
pip install mysql
等等。安装一系列所需软件。
记住安装 GCC,不然会莫名的报错,具体是什么错误忘记了,反正要安装这个
pip install gcc
4,配置uwsgi与Nginx
假设你已经安装完了,一系列所需软件,同时假设你的项目没有任何问题,也收集了静态文件了。
①,配置uwsgi
在项目的根目录下,创建 uwsgi.ini.名字任意。进行如下配置
[uwsgi]
socket =:8001 #套接字端口。只需要填端口就行。与Nginx相同
chmod-socket = 666 # 固定
chdir = /mysite/项目名
wsgi-file = /mysite.项目/项目同名文件/wsgi.py #项目目录下的wsgi.py 文件也可以使用下面的
#module = /mysite/项目/项目同名文件.wsgi
touch-reload = /mysite/项目 # 自动加载
py-auto-reload = 1 #自动加载
processes=10 # 十个进程
threads=2 #2个线程
enable-threads = True
master=True
pidfile=uwsgi.pid
daemonize = /mysite/log/blog_uwsgi.log # uwsgi的日志目录(自定义)
注意:
1,套接字端口需要与Nginx的端口相同,否则不能进行数据交互。
2,wsgi.py 文件一定要是项目目录下的文件
3,
touch-reload = /mysite/项目 # 自动加载
py-auto-reload = 1 #自动加载
两句实现,当指定目录下文件发生改变时,自动重启uwsgi,这样就不用每次去执行启动语句。
4,其他一些设置都是固定的,根据需要自行添加修改。
②,配置Nginx
首先进入Nginx的配置文件目录,我这里在/etc/nginx/nginx.conf
注意:如果Nginx目录下有default.conf,先把他删除。不然会造成端口占用。
具体配置如下:
#For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user root;# 这里我为了偷懒,直接给最高权限,省的麻烦 。
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
...中间部分代码省略,意思就是不需要我们去改变它...
...下面需要修改的地方都有注释,没有注释的地方不需要改动...
...mysite为我们建立的虚拟环境目录,别忘了...
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /mysite/项目名字; # 源代码项目路径(根路径)
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
include /etc/nginx/uwsgi_params; #导入uwsgi的配置项
location /static {
alias /mysite/项目下的静态文件路径/;
}
location /media {
alias /mysite/项目目录下媒体文件的路径/;#如果项目没有涉及到,这个可以不用配置,直接留空或删除
}
location / {
# 最重要的部分!!!!!!
include uwsgi_params; # 这个是固定的,添加uwsgi的配置项,上面有导入
uwsgi_pass 127.0.0.1:8001;# uwsgi重定向的地址,这里的端口要跟uwsgi套接字的端口一样,这里很重要,不然总是不能加载静态文件!
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
②,启动uwsgi 跟 Nginx
# 启动 Nginx
systemctl restart nginx
# 启动uwsgi
uwsgi --ini 项目目录下的wsgi.ini
这是会显示:getting INI configuration from 项目目录下的wsgi.ini
这个时候外界就可以通过 IP 地址访问了。
注意: 访问时,url要跟自己项目配置的url一样,不然那会出现 Bad Request(400)错误。