简介
本来以为最后将代码部署到服务器上是一件很容易的事,没想到在这里又踩了无数的坑。虽然网上与此相关的博客有很多很多,但是每一个的方法都略有不同,很多方法用过之后发现并不能成功部署(绝望...)。于是我写一篇博客记录一下我在配置过程中的详细步骤,也方便日后有需时看这篇博客回忆一下。
安装与配置
基本环境
服务器:腾讯云 CVM 标准型S3,操作系统为 Ubuntu Server 16.04.1 LTS 64位
python:3.5.2
mysql:5.7.23
pip3:18.1
安装配置
1、django及其相关库的安装
在这里我们使用的django版本号为1.9.5,直接运行以下命令即可成功安装:
pip3 install --user django~=1.9.5
注:命令中若不加--user
,则可能出现用户权限的问题而无法成功安装。
此外,我们还需要mysqlclient
和pymysql
实现django与mysql数据库的交互:
pip3 install --user mysqlclient~=1.3.7
pip3 install --user pymysql~=0.9.2
2、uWSGI的安装
直接运行以下命令即可成功安装:
pip3 install --user uwsgi
注:一般这样安装的uWSGI是没有问题的,如果大家不放心的话,可以参考网上测试uWSGI的方法,此处省略。
3、nginx的安装
直接运行以下命令即可成功安装:
sudo apt-get install nginx
注:我一开始是用make源码的方式安装了nginx,但是发现安装之后使用起来很不方便,很多路径都找不到;而网上关于nginx的配置基本都是用上述命令安装的,所以为了省事,我也就改成使用上述命令直接安装。
使用
在使用nginx
和uWSGI
进行配置时,最容易出错的是路径问题(捂脸)所以我在这里先给出我的项目架构,再说明具体配置方式。
项目架构(目录)
(.env) ubnutu@VM-0-10-ubuntu:~/WeChatTicket$(即在/home/ubuntu/WeChatTicket/目录下)
.
├── manage.py
├── configs.json
├── static/
├── WeChatTicket/
| └── wsgi.py # wsgi模块
└── deployment/
├── mysite_nginx.conf # nginx配置文件
├── mime.types # nginx相关配置文件
├── uwsgi_params # nginx中与uWSGI相关的参数引用文件
├── nginx_error.log # nginx错误日志文件
├── nginx_access.log # nginx连接日志文件
├── mysite_uwsgi.ini # uWSGI配置文件
├── uwsgi.log # uWSGI日志文件
└── uwsgi.pid # uWSGI控制文件
文件配置
1、在mysite_nginx.conf
中写入如下内容:
# mysite_nginx.conf
# 设置用户权限
user root;
events {
worker_connections 1024;
}
http {
#加入mime.types配置文件
include mime.types;
# nginx需要连接到的地址(即uWSGI在本地开启的地址,在这里选用9090端口)
upstream django {
server 127.0.0.1:9090;
}
# 配置服务器
server {
# 你监听的端口号
listen 80;
# 服务器
server_name 236584.iterator-traits.com;
charset utf-8;
# 输出日志
access_log /home/ubuntu/WeChatTicket/deployment/nginx_access.log;
error_log /home/ubuntu/WeChatTicket/deployment/nginx_error.log;
# 最大上传尺寸
client_max_body_size 75M;
#与uWSGI连接的地址及静态文件配置
location / {
alias /home/ubuntu/WeChatTicket/static/;
try_files $uri $uri/ @django;
}
location @django {
uwsgi_pass django;
include uwsgi_params;
}
}
}
2、从nginx
的配置文件夹conf
中直接将uwsgi_params
文件拷贝到deployment
目录;或者直接在deployment
目录下创建uwsgi_params
文件并写入如下内容:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
3、从nginx
的配置文件夹conf
中直接将mime.types
文件拷贝到deployment
目录;或者直接在deployment
目录下创建mime.types
文件并写入如下内容:
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
4、在mysite_uwsgi.ini
中写入如下内容:
[uwsgi]
# django相关设置
socket = 127.0.0.1:9090
# 项目所在目录
chdir = /home/ubuntu/WeChatTicket
# wsgi模块所在地址
module = WeChatTicket.wsgi
# 进程相关设置
master = true
# 最大工作进程与线程
processes = 4
threads = 2
# 离开时清除环境
vacuum = true
# pid文件
pidfile = uwsgi.pid
# 日志文件
daemonize = uwsgi.log
运行(此时终端位于deployment目录下)
1、启动uWSGI
:
uwsgi --ini mysite_uwsgi.ini
此时会发现,目录下增加了uwsgi.pid
和uwsgi.log
两个文件。
2、启动nginx
:
sudo nginx -c /home/ubuntu/WeChatTicket/deployment/mysite_nginx.conf
此时会发现,目录下增加了nginx_error.log
和nginx_access.log
两个文件。
使用sudo
是为了解决用户权限的限制。
3、使用浏览器,输入ip地址,检测服务是否正确部署。
附:常用命令
-
ps aux|grep nginx(或uwsgi)
:查看进程状态。 -
sudo nginx -c nginx.conf
:以nginx.conf
的配置开启nginx
的服务。 -
sudo pkill -9 nginx
:强制结束nginx
服务。 -
uwsgi --ini uwsgi.ini
:初始化uWSGI
服务并开启。 -
uwsgi --stop uwsgi.pid
:终止uWSGI
服务,同时会删除uwsgi.pid
。 -
uwsgi --reload uwsgi.pid
:重新加载uWSGI
服务。
总结
Python3 + Django + uwsgi + nginx 配置部署的学习就到此结束了,如果大家有什么疑问,可以随时提出。文档中有什么错误或者不足之处,也欢迎大家批评指正。
参考资料:
1、uwsgi服务启动(start)停止(stop)重新装载(reload)
2、uWSGI+django+nginx的工作原理流程与部署历程
3、基于nginx和uWSGI在Ubuntu上部署Django