Django+uwsgi+nginx 搭建web應(yīng)用是一種常見的模式唠粥,此文檔主要記錄如何操作晤愧。
參考文檔:Setting up Django and your web server with uWSGI and nginx
代碼地址:https://github.com/xander-ye/my_website.git
部署環(huán)境:CentOS?
步驟:
1.安裝uwsgi和nginx
pip install uwsgi
yum install nginx
2. nginx相關(guān)設(shè)置
安裝好的nginx需要簡單的修改配置蛉腌。/etc/nginx/nginx.conf 中有兩個(gè)地方:
一是,nginx一般默認(rèn)安裝后舅巷,其用戶為 user ?nginx河咽,我們需要修改為 user root;
二是飒房,在include 地方在添加一條記錄媚值,include /etc/nginx/sites-enabled/*;這樣的話待會我們項(xiàng)目的nginx配置直接鏈接到此文件夾下面即可嚼松。
3.在項(xiàng)目中創(chuàng)建三個(gè)配置文件
uwsgi_params文件直接拷貝教程里面的就好惜颇,nginx/uwsgi根據(jù)自己的情況修改凌摄。
創(chuàng)建鏈接漓帅,將應(yīng)用的nginx配置鏈接到sites-enabled目錄
ln -s /root/my_website_server/my_website/mysite/mysite_nginx.conf ?/ect/nginx/sites-enable/
重啟nginx
4.運(yùn)行試試看
cd? 到mysite_uwsgi.ini文件所在的文件夾痴怨,運(yùn)行 uwsgi --ini mysite_uwsgi.ini
It works!
瀏覽器訪問正常浪藻!
補(bǔ)充
這樣運(yùn)行的話等我們關(guān)閉窗口程序便立刻終止乾翔,而且日志輸出到終端也不妥。
針對這兩點(diǎn)我們可以使用Linux的nohup命令和輸出重定向功能
在我們執(zhí)行的命令前加上nohup萌丈,那么將要執(zhí)行的命令便會在后臺運(yùn)行雷则。
輸出重定向
正確輸出 覆蓋 :命令>文件
正確輸出 追加:命令>>文件
錯(cuò)誤命令 2> 文件
錯(cuò)誤命令 2> 文件
正確輸出和錯(cuò)誤輸出都覆蓋到文件:命令&> 文件
追加:命令&>>文件
正確輸出追加到文件1,錯(cuò)誤輸出追加到文件2:
命令>>文件1 ?2>>文件2
我們的運(yùn)行命令變成:
nohup uwsgi --ini mysite_uwsgi.ini > /root/my_website_server/mysite.log
腳本化
在root目錄下面創(chuàng)建一個(gè)文件夾bin度迂,在bin下面創(chuàng)建文件start_mysite
添加可執(zhí)行權(quán)限:chmod 755 start_mysite
如果直接在終端輸入命令惭墓,結(jié)果定是command not found.
輸入 準(zhǔn)確的命令路徑即可 ? ?. /start_mysite
為了讓命令直接輸入也可運(yùn)行,需要再進(jìn)行一些操作诅妹,如下:
需要了解的知識:
Linux環(huán)境變量PATH毅人,實(shí)際上就是記錄的一個(gè)字符串,當(dāng)你在終端輸入命令的時(shí)候划煮,Linux會去查找PATH里面記錄的路徑弛秋,依次搜索里面所記錄的文件目錄下是否包含我們輸入的命令,如果能搜到就運(yùn)行蟹略,否則就是我們常見的提示:command not found
所以我們要做的就是把我們剛剛創(chuàng)建的bin目錄添加到PATH中遏佣。
問題又來了,如何添加呢意敛?
在用戶登錄Linux的時(shí)候,它是有配置文件需要去讀取的:
/etc/profile ? 這是系統(tǒng)配置文件草姻,不建議修改;
~/.bash_profile ?或者 ~/bash_login 還有 ~/.proflie 這三個(gè)才是用戶配置文件敞曹,當(dāng)用戶登錄的時(shí)候跌榔,依次讀取捶障。一旦讀取到前面任何一個(gè)文件便終止后面文件的讀取。
所以担平,我們在~/.bash_profile中修改即可。
export 的作用是將PATH設(shè)定為全局變量暂论。
文檔保存之后還不行取胎,因?yàn)槲覀儎倓偺岬脚惹希宋臋n只會在用戶登錄的時(shí)候才會去讀取,我們剛剛進(jìn)行的操作事實(shí)上還未生效您市,登出再登入?當(dāng)然可以薪棒,更方便的是俐芯,我們也可以使用命令讓修改立即生效:
source ~/.bash_profile
至此钉鸯,你已經(jīng)可以直接運(yùn)行start_mysite來啟動應(yīng)用了。
有可能遇到的問題
uwsgi?invalid?request?block?size:?21327?(max?4096)...skip
You just need to increase the buffer size in uWSGI settings.
buffer-size=32768
跨域:https://github.com/ottoyiu/django-cors-headers#configuration
pip?install?django-cors-headers
INSTALLED_APPS=(
...
'corsheaders',
...
)
MIDDLEWARE=[#Or?MIDDLEWARE_CLASSES?on?Django?<?1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
CORS_ORIGIN_ALLOW_ALL=True
這是直接修改Django讓應(yīng)用允許跨域扣蜻,另外還有一個(gè)方法是修改nginx配置,讓nginx傳過來的請求在Django看來似乎并沒有跨域莽使。
執(zhí)行:uwsgi?--socket?mysite.sock?--wsgi-filetest.py出現(xiàn)錯(cuò)誤:
(13:?Permission?denied)nginx error log(/var/log/nginx/error.log)
查看nginx配置: ?/etc/nginx/nginx.conf
其中的 user 多半是 nobody ?,或者是nginx ,改成 root