前段時間弄了個 Django 的程序,為了在服務(wù)器上跑起來,花費(fèi)了不少的時間搜索相關(guān)內(nèi)容盖腕,現(xiàn)在記錄下來。
運(yùn)行條件
云主機(jī) + Ubuntu server 16.04.2 LTS + Nginx 1.10 + Django 1.10 + uWSGI 2.0.14
修改 Nginx 配置
服務(wù)器上用了
https
浓镜,可以參照我之前的記錄提前弄好溃列。
《Let's Encrypt 使用記錄 - 簡書》
使用之前當(dāng)然要先安裝,簡單地使用 apt
命令安裝即可
sudo apt install nginx
安裝后用終端切換到/etc/nginx/sites-enable/
下竖哩,新建 project-https
文件(https用)哭廉,輸入以下內(nèi)容:
server {
listen 443 ssl;
server_name domain.com
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:6666;
}
location /static {
root /var/www/project-html;
}
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparams.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
127.0.0.1:6666
這個參數(shù)要在后面用到,在這里可以提前決定Django 使用哪一個端口號相叁。
uwsgi_params
的文件內(nèi)容會在后面提及遵绰。
location /static
是在 Django admin 中用到的 html 和 js 文件,復(fù)制過去就好增淹,剩下的帶 ssl 的參數(shù)就請按照上面給出的鏈接做吧椿访。
然后在同樣的目錄下新建project-http2https
文件(用于http 跳轉(zhuǎn)到 https),輸入以下內(nèi)容:
server {
listen 80;
server_name domain.com
return 301 https://$server_name$request_uri;
}
http 狀態(tài)碼 中 301 代表 Moved Permanently虑润,意為永久移動成玫。
最后的是 request_uri
并非 request_url
,這算是之前在輸入的時候沒有仔細(xì)留意到的一點(diǎn)拳喻,多花了點(diǎn)時間哭当。
切換到 /etc/nginx/
,補(bǔ)充在 https 用的文件中用到的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;
安裝 uWSGI
用 pip
即可钦勘。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi
-i
后面表示從國內(nèi)的鏡像站下載,速度會快不少亚亲。這是個小竅門彻采。
修改 Django 設(shè)置
在項(xiàng)目設(shè)置的目錄中添加uwsgi_file.py
文件腐缤,文件內(nèi)容如下:
import os,sys
import django.core.handlers.wsgi
import django
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
sys.path.append('/home/ubuntu/project/')
os.environ['DJANGO_SETTINGS_MODULE']='project.settings'
django.setup()
application = django.core.handlers.wsgi.WSGIHandler()
第五行中的地址要根據(jù)自己的項(xiàng)目文件位置設(shè)置,例子中是放在/home/ubuntu/project/
中的肛响,同樣要留意的是接下來的第六行的填寫岭粤。
為了方便,我弄了幾個批處理文件run.sh
和 stop.sh
特笋,用chmod +x
給了執(zhí)行權(quán)限剃浇。
- run.sh
echo 'begin'
sudo uwsgi -s 127.0.0.1:6666 --chdir /home/ubuntu/project/project -p 10 -w uwsgi_file -d /home/ubuntu/status.log
echo 'done'
127.0.0.1:6666
,留意到這一點(diǎn)了嗎雹有,這是由之前 Nginx 配置中所決定的偿渡。當(dāng)然,不建議使用常見的端口霸奕,以免影響其他程序的使用。
--chdir
后面跟著的是項(xiàng)目的文件吉拳。
-p
后面所跟著的數(shù)字代表開多少個進(jìn)程质帅。
-w
后面跟著的是我們上面新建的文件。
-d
表示以后所有的程序狀態(tài)都存到指定的文件中留攒。
- stop.sh
sudo kill -9 $(ps aux | grep 'uwsgi' | awk '{print $2}' )
stop.sh
文件相比較之下就顯得簡單了煤惩,直接用kill
殺死帶 uwsgi
的進(jìn)程。
你也可以新建一個detect.sh
炼邀,查看是否正常啟動魄揉。內(nèi)容如下
ps aux | grep 'uwsgi'
啟動
- 首先是要先啟動
Nginx
,sudo service nginx start
- 之后運(yùn)行上面寫好的
run.sh
完成拭宁!
來自個人 Python 文集