Centos6.8:Django+uWSGI+Nginx+supervisord部署web伺服器
幫團隊的公司建個官網,部署伺服器的時候採用了騰訊雲推薦的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/
在/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