幫團隊的公司建個官網,部署服務器的時候採用了騰訊雲推薦的Django+uWSGI+Nginx+supervisord
方案,也採用過幾個教程,最後發現這兩個比較好:
官方教程(無supervisord),英文,怕英文的話太吃虧了。
騰訊雲的教程很簡潔,推薦下載文字版,且網速好的話不用配置清華源,理論上一次就能成功,但是如果中間哪步出了問題。。。你就需要看看下面的教程了。推薦騰訊雲等平臺上的“實驗室”,如,基於 CentOS 搭建 Python 的 Django 環境,有免費服務器嘗試。只是應該不能使用Putty與WinSCP。
文章目錄
說明
目標
最後,我們將要實現以下通路:
客戶端 <-> 服務器 <-> the socket <-> uwsgi <-> Django
服務器預裝環境
- centos 6.8x64,root用戶
- python2(不用,後面裝python3)
工具說明
推薦下列工具,不會用的自行搜索。
- win10筆記本一臺;
- 常用命令.txt;
- putty: 用於連接服務器,支持複製粘貼;
- WinSCP: 可實現一些重要功能——將本機的文件拖拽複製到服務器上+擺脫linux上的vim。
可以說,有了putty和WinSCP,服務器相當於裝在你電腦上了。
安裝
Nginx
先安裝 EPEL 的基礎庫,再安裝Nginx
yum install epel-release -y
yum install nginx -y
啓動 Nginx(centos7使用systemctl命令)
service enable nginx
service start nginx
python3.4與pip3
sudo yum groupinstall -y development tools
sudo yum install -y epel-release python34-devel libxslt-devel libxmt2-devel openssl-devel
sudo yum install -y python34
sudo yum install -y python34-setuptools
sudo easy_install-3.4 pip
uWSGI
在python3的虛擬環境下:
yum install gcc -y # 安裝 uwsgi 需要編譯環境
python3.4 -m pip install uwsgi # 安裝 uwsgi
django
推薦配置虛擬環境的方案
正式項目部署時也參考這裏的步驟
cd /home/
mkdir django
cd django
python3.4 -m venv venv #後者可換成你喜歡的名字,但這樣後面的命令也有改動
創建完成後,進入虛擬環境、安裝 Django 、創建項目
source /home/django/venv/bin/activate # 此命名可保存到“常用命令.txt”,
pip install django
django-admin startproject <project_name># 將<project_name>改成你的項目名稱,下同,可把/home/django/<project_name>保存到“常用命令.txt”;
cd <project_name>
python manage.py startapp <app_name># 建議用網站名稱代替<app_name>,但這個名稱不能與項目名稱相同。
配置
配置並測試Django
允許域名
使 Django 能處理來做所有域名中的請求,目標文件爲/home/django/<project_name>
目錄下的settings.py
,這裏有兩種操作,一種是vim,另一種是WinSCP雙擊打開,“嚴重”推薦後者,避免學習vim,方便複製粘貼。
vim my/settings.py
找到
ALLOWED_HOSTS = []
改爲
ALLOWED_HOSTS = ['*']
(vim要按i
輸入,完後,ecs
鍵後輸入:wq
,再按Enter鍵)
運行測試
下面測試Django(當前目錄在/home/django/<project_name>
)
python manage.py runserver 0.0.0.0:8000
用電腦瀏覽器訪問雲主機的 IP 地址,可以看到 Django 的啓動頁面了。
回到命令行,Ctrl+C斷開。
收集靜態文件
後面你要處理Django中的static文件,但現在你就可以這樣了,先修改/home/django/<project_name>/<project_name>/
下的settings.py
。添加(一般在文末):
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然後在命令行運行:
python manage.py collectstatic
插播:端口選擇
這篇教程裏,通常使用8000端口,你也可以使用其他的,但謹慎使用80端口。如果發生端口占用的情況,請謹慎使用下列代碼:
lsof -i:80
kill -9 [UID]
首次配置uWSGI
若仍未安裝uWSGI,請回到“安裝”一節。
基礎測試
在/home/django/<project_name>
目錄下,創建測試文件test.py
:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
在命令行中運行uWSGI:
uwsgi --http :8000 --wsgi-file test.py
-
http :8000
:使用http協議,端口8000. -
wsgi-file test.py
:加載特定文件test.py
如果你訪問
<你的服務器外網ip或者域名>:8000
,看到"Hello World"字樣,便可確認已連接下面通路:
客戶端 <-> uWSGI <-> Python
啓動Django
下面執行 uwsgi 命令來啓動 Django,同樣的,更改<project_name>
uwsgi --http :8000 --chdir /home/django/<project_name> --home=/home/django/venv --module <project_name>.wsgi
chdir
: 工作目錄爲/home/django/<project_name>/<project_name>
home
:虛擬環境根目錄。module <project_name>.wsgi
是指/home/django/<project_name>/<project_name>
目錄中的wsgi.py
文件。
執行後,訪問雲主機,若看到 Django 的啓動頁面,按下 Ctrl + C,退出進程。
客戶端 <-> uWSGI <-> Django
下面我們將使用服務器。
配置Nginx
首次配置Nginx
若未安裝Nginx,請回到“安裝”一節。確保打開Nginx
service restart nginx
訪問<你的服務器外網ip或者域名>:80
——nginx所在的端口,應該會出現“Welcome to nginx!”字樣(或502),這意味着:
客戶端<->服務器
如果你的服務器的80端口被其他程序佔用,Kill掉這個程序,或者更改nginx配置選用其他端口。
再次配置(Configure)nginx
在/home/django/wowuo/
文件下,需要一份uwsgi_params
文件,以備nginx使用
cp /etc/nginx/uwsgi_params /home/django/wowuo/
或者github下載。
在/etc/nginx/conf.d/
目錄下創建<project_name>_nginx.conf
文件:
# the upstream component nginx needs to connect to
upstream django {
# server unix:///home/django/<project_name>/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
listen 8000;
server_name <>;
charset utf-8;
client_max_body_size 75M;
location /media {
alias /home/django/<project_name>/media;
}
location /static {
alias /home/django/<project_name>/static;
}
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params;
}
}
nginx測試
重啓nginx,如果有問題,它會告訴你。
service nginx restart
測試前,添加一個圖像,比如media.png,到/home/django/<project_name>/media
中,如果可以訪問你的外網ip或域名:8000/media/media.png
,比如,當時我當時用的圖片(或許你注意到了圖片的地址並沒有:8000
,但你的地址現在不能省略:8000
):
nginx、uWSGI、test.py
同樣是"Hello World",不一樣的說法——這次我們讓nginx來說(注意目錄):
uwsgi --socket :8001 --wsgi-file test.py
socket :8001
:使用uwsgi
協議,8001端口。
這時訪問<你的服務器外網ip或者域名>:8000
,如果成功:
客戶端 <-> 服務區 <-> the socket <-> uWSGI <-> Python
爲什麼不是<你的服務器外網ip或者域名>:8001
呢?你可以試試,然後在終端看看報錯——體會http協議與uwsgi協議的區別。
改進Socket
我們應該使用Unix socket,而不是剛纔那種更簡單的。
編輯<project_name>_nginx.conf
,更改這部分
# the upstream component nginx needs to connect to
upstream django {
server unix:///home/django/<project_name>/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
重啓nginx。
再次運行uWSGI,注意當前目錄:
uwsgi --socket mysite.sock --wsgi-file test.py
這裏是事故多發區了,如果你再次訪問網站:
如果502?
查看日誌,在命令行中輸入:
tail -10 /var/log/nginx/error.log
其中一條(…代表省略部分信息)
2018/10/01 11:20:53 [crit] 19766#0: *14 connect() to unix:///home/django/... failed (13: Permission denied) while connecting to upstream, client: 119.2.128.225, server: ..., request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///home/django/...:", host: "www....:8000"
注意 “[crit] ”和“failed (13: Permission denied)”,這代表nginx沒有權限打開那個sock文件。
可以嘗試這個:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666
如果還不行,請再次檢查是不是[crit]錯誤。如果是,可以把你當前用戶加入nginx組中,或直接:(我是後者,因爲我使用root用戶,用前者略危險)。
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 --chown-socket = nginx:nginx
Django、uwsgi 、nginx
若剛纔的步驟正常運行,可先:
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
"Hello World"變爲你的Django項目(或許是個火箭?)
用ini文件配置uwsgi
爲簡化命令,下面用ini文件配置uwsgi。
在/home/django/<project_name>
目錄下創建uwsgi.ini文件,向內粘貼:
[uwsgi]
socket = /home/django/<project_name>/<project_name>.sock
chdir = /home/django/<project_name>
wsgi-file = <project_name>/wsgi.py
plugins = python
virtualenv = /home/django/venv/
processes = 2
threads = 4
chmod-socket = 664
chown-socket = nginx:nginx
vacuum = true
其中
chown-socket = nginx:nginx
爲nginx用戶和nginx用戶組。
再次運行uwsgi
uwsgi --ini mysite_uwsgi.ini
進程守護supervisord(可選)
爲了讓程序持久運行,可採用supervisord
首先爲系統的 Python2 安裝上 pip
yum install python-pip -y
安裝完成後,我們使用 pip 來安裝 supervisord,並輸出配置文件
python -m pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf
接下來使用 vim /etc/supervisord.conf
來編輯配置文件,在文件尾部添加如下代碼
[program:my]
command=/usr/bin/uwsgi --ini /home/django/<program_name>/uwsgi.ini
directory=/home/django/<program_name>
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true
添加完成後,執行命令啓動 Supervisord即可
supervisord -c /etc/supervisord.conf