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/

或者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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章