virtualenv+nginx+uwsgi+django配置
現有django app “mysite”,需要用nginx和uwsgi。
下圖是在virtualenv建立的虛擬環境下:
A。單應用
1.安裝nginx,版本是1.13.4:
安裝gcc g++的依賴庫 #apt-get install build-essential #apt-get install libtool 安裝 pcre依賴庫(http://www.pcre.org/) #sudo apt-get install libpcre3 libpcre3-dev 安裝 zlib依賴庫(http://www.zlib.net) #apt-get install zlib1g-dev 安裝 ssl依賴庫 #apt-get install openssl 安裝Nginx(http://nginx.org) 下載最新版本: #cd /usr/local/src #wget http://nginx.org/download/nginx-1.13.4.tar.gz 解壓: #tar -zxvf nginx-1.13.4.tar.gz 進入解壓目錄: #cd nginx-1.13.4 配置: #./configure --prefix=/usr/local/nginx 編輯nginx: #make 安裝nginx: #sudo make install 啟動nginx: #sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 注意:-c 指定配置檔案的路徑,不加的話,nginx會自動載入預設路徑的配置檔案,可以通過 -h檢視幫助命令。 檢視nginx程序: #ps -ef|grep nginx 停止 Nginx #cd /usr/local/nginx/sbin/ #./nginx -s stop
2.安裝uwsgi,版本2.0.15:
注意:需要先安裝pcre,在上面的nginx中安裝了,不然會有提示rebuild with pcre。
安裝:
#pip install uwsgi -I –no-cache-dir
用ini執行:
在虛擬環境目錄(看上面的圖片)下新建檔案uwsgi.ini,添如下面程式碼:
[uwsgi] vhost = false master = true enable-threads = true workers = 2 wsgi-file = /root/venv/mysite/mysite/wsgi.py virtualenv =/root/venv chdir =/root/venv/mysite processes = 2 listen = 80 socket = 127.0.0.1:8000 pidfile = /root/venv/mysite/tmp/mysite.pid vacuum = true #daemonize = /root/venv/mysite/tmp/mysite.log #開啟就是後臺執行 reload-mercy = 8 max-requests = 5000 thunder-lock = true buffer-size = 32768
注:關於socket和http的一點說明:
用http就可以直接 瀏覽器->uwsgi->django
用socket 瀏覽器->nginx->uwsgi->django
3.啟動專案:
a.venv目錄下啟動uwsgi:
#uwsgi –ini ./uwsgi.ini
b.將STATIC_ROOT = os.path.join(BASE_DIR, "static/")
加入mysite/mysite/settings.py,然後執行python manage.py collectstatic
c.在/usr/local/nginx/conf/nginx.conf新增下面程式碼(新增在http{}中):
server {
listen 8080;
server_name localhost;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
client_max_body_size 35m;
}
}
d.瀏覽器開啟127.0.0.1:8080就可以訪問專案了。
注意:conf中uwsgi_pass和ini中的socket相同
B。多應用
由於只有一個mysite app,所以多app用mysite複製一份到HelloWorld資料夾中。檔案見下圖:
多應用是用一個uwsgi和nginx,其中nginx中的server是對應一個app。
a。將上面3.c中的server改為下面程式碼(通常是同一埠,不同的server_name):
server {
listen 8081;
server_name localhost;
charset utf-8;
client_max_body_size 35m;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_param UWSGI_CHDIR /root/venv/mysite; #你的專案的路徑,最好用完整路徑
uwsgi_param UWSGI_SCRIPT mysite.wsgi; #指向wsgi.py,相對於專案的根目錄
}
}
server {
listen 8080;
server_name localhost;
charset utf-8;
client_max_body_size 35m;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_param UWSGI_CHDIR /root/venv/HelloWorld; #你的專案的路徑,最好用完整路徑
uwsgi_param UWSGI_SCRIPT mysite.wsgi; #指向wsgi.py,相對於專案的根目錄
}
}
}
b。將uwsgi.ini改為下面程式碼(這裡不需要具體指定app,nginx已經指定了):
[uwsgi]
vhost =true
master = true
enable-threads = true
workers = 2
processes = 2
listen = 80
socket = 127.0.0.1:8000
pidfile = /root/venv/mysite/tmp/mysite.pid
vacuum = true
#daemonize = /root/venv/mysite/tmp/mysite.log
reload-mercy = 8
max-requests = 5000
thunder-lock = true
buffer-size = 32768
c。啟動uwsgi和nginx,訪問127.0.0.1:8080/admin和127.0.0.1:8081/admin應該都是管理介面。當專案中沒有app時可能報錯,所以採用複製mysite app進行測試。