簡介
本來以為最后將代碼部署到服務(wù)器上是一件很容易的事躺坟,沒想到在這里又踩了無數(shù)的坑按声。雖然網(wǎng)上與此相關(guān)的博客有很多很多,但是每一個的方法都略有不同趾牧,很多方法用過之后發(fā)現(xiàn)并不能成功部署(絕望...)故响。于是我寫一篇博客記錄一下我在配置過程中的詳細(xì)步驟傀广,也方便日后有需時看這篇博客回憶一下。
安裝與配置
基本環(huán)境
服務(wù)器:騰訊云 CVM 標(biāo)準(zhǔn)型S3彩届,操作系統(tǒng)為 Ubuntu Server 16.04.1 LTS 64位
python:3.5.2
mysql:5.7.23
pip3:18.1
安裝配置
1伪冰、django及其相關(guān)庫的安裝
在這里我們使用的django版本號為1.9.5,直接運(yùn)行以下命令即可成功安裝:
pip3 install --user django~=1.9.5
注:命令中若不加--user
樟蠕,則可能出現(xiàn)用戶權(quán)限的問題而無法成功安裝贮聂。
此外靠柑,我們還需要mysqlclient
和pymysql
實(shí)現(xiàn)django與mysql數(shù)據(jù)庫的交互:
pip3 install --user mysqlclient~=1.3.7
pip3 install --user pymysql~=0.9.2
2、uWSGI的安裝
直接運(yùn)行以下命令即可成功安裝:
pip3 install --user uwsgi
注:一般這樣安裝的uWSGI是沒有問題的吓懈,如果大家不放心的話歼冰,可以參考網(wǎng)上測試uWSGI的方法,此處省略耻警。
3隔嫡、nginx的安裝
直接運(yùn)行以下命令即可成功安裝:
sudo apt-get install nginx
注:我一開始是用make源碼的方式安裝了nginx,但是發(fā)現(xiàn)安裝之后使用起來很不方便榕栏,很多路徑都找不到畔勤;而網(wǎng)上關(guān)于nginx的配置基本都是用上述命令安裝的蕾各,所以為了省事扒磁,我也就改成使用上述命令直接安裝。
使用
在使用nginx
和uWSGI
進(jìn)行配置時式曲,最容易出錯的是路徑問題(捂臉)所以我在這里先給出我的項(xiàng)目架構(gòu)妨托,再說明具體配置方式。
項(xiàng)目架構(gòu)(目錄)
(.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相關(guān)配置文件
├── uwsgi_params # nginx中與uWSGI相關(guān)的參數(shù)引用文件
├── nginx_error.log # nginx錯誤日志文件
├── nginx_access.log # nginx連接日志文件
├── mysite_uwsgi.ini # uWSGI配置文件
├── uwsgi.log # uWSGI日志文件
└── uwsgi.pid # uWSGI控制文件
文件配置
1吝羞、在mysite_nginx.conf
中寫入如下內(nèi)容:
# mysite_nginx.conf
# 設(shè)置用戶權(quán)限
user root;
events {
worker_connections 1024;
}
http {
#加入mime.types配置文件
include mime.types;
# nginx需要連接到的地址(即uWSGI在本地開啟的地址兰伤,在這里選用9090端口)
upstream django {
server 127.0.0.1:9090;
}
# 配置服務(wù)器
server {
# 你監(jiān)聽的端口號
listen 80;
# 服務(wù)器
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連接的地址及靜態(tài)文件配置
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
目錄下創(chuàng)建uwsgi_params
文件并寫入如下內(nèi)容:
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
目錄下創(chuàng)建mime.types
文件并寫入如下內(nèi)容:
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
中寫入如下內(nèi)容:
[uwsgi]
# django相關(guān)設(shè)置
socket = 127.0.0.1:9090
# 項(xiàng)目所在目錄
chdir = /home/ubuntu/WeChatTicket
# wsgi模塊所在地址
module = WeChatTicket.wsgi
# 進(jìn)程相關(guān)設(shè)置
master = true
# 最大工作進(jìn)程與線程
processes = 4
threads = 2
# 離開時清除環(huán)境
vacuum = true
# pid文件
pidfile = uwsgi.pid
# 日志文件
daemonize = uwsgi.log
運(yùn)行(此時終端位于deployment目錄下)
1符衔、啟動uWSGI
:
uwsgi --ini mysite_uwsgi.ini
此時會發(fā)現(xiàn),目錄下增加了uwsgi.pid
和uwsgi.log
兩個文件糟袁。
2判族、啟動nginx
:
sudo nginx -c /home/ubuntu/WeChatTicket/deployment/mysite_nginx.conf
此時會發(fā)現(xiàn),目錄下增加了nginx_error.log
和nginx_access.log
兩個文件项戴。
使用sudo
是為了解決用戶權(quán)限的限制形帮。
3、使用瀏覽器周叮,輸入ip地址辩撑,檢測服務(wù)是否正確部署。
附:常用命令
-
ps aux|grep nginx(或uwsgi)
:查看進(jìn)程狀態(tài)仿耽。 -
sudo nginx -c nginx.conf
:以nginx.conf
的配置開啟nginx
的服務(wù)合冀。 -
sudo pkill -9 nginx
:強(qiáng)制結(jié)束nginx
服務(wù)。 -
uwsgi --ini uwsgi.ini
:初始化uWSGI
服務(wù)并開啟氓仲。 -
uwsgi --stop uwsgi.pid
:終止uWSGI
服務(wù)水慨,同時會刪除uwsgi.pid
得糜。 -
uwsgi --reload uwsgi.pid
:重新加載uWSGI
服務(wù)。
總結(jié)
Python3 + Django + uwsgi + nginx 配置部署的學(xué)習(xí)就到此結(jié)束了晰洒,如果大家有什么疑問朝抖,可以隨時提出。文檔中有什么錯誤或者不足之處谍珊,也歡迎大家批評指正治宣。
參考資料:
1、uwsgi服務(wù)啟動(start)停止(stop)重新裝載(reload)
2砌滞、uWSGI+django+nginx的工作原理流程與部署歷程
3侮邀、基于nginx和uWSGI在Ubuntu上部署Django