一.gunicorn和nginx的簡介
gunicorn需要搭配nginx使用,那麼兩者的作用到底是什麼。
1.gunicorn簡介:gunicorn是一個Python WSGI UNIX服務器。WSGI(Web Server Gateway Interface)是Web服務網關接口,位於WEB應用層和WEB服務器層之間。在這裏WEB應用當然是指Python解釋器及Django編寫的程序,而WEB服務器指的是Nginx,所以Gunicorn位於兩者之間。
2.Nginx簡介:Nginx是反向代理服務器,接收外部Internet網絡請求,並將請求轉發給內部網絡的WSGI,並將響應信息反饋給外部Internet用戶。所以gunicorn就是起到溝通作用,將Django和Nginx聯繫起來,也就是我們說的網關作用。
二.Django,Gunicorn,Nginx的安裝
在這裏我們使用的是Django最新版本1.8.4,當然,你也可以選擇其他版本。
#pip3 install Django==1.8.4
#pip3 install gunicorn
#apt-get install python-dev nginx
三.環境搭建與測試
1.創建Django項目
創建mysite項目
#django-admin.py startproject mysite
#cd mysite/
創建home應用
# python3 manage.py startapp home
2.設置setting.py文件
添加app,需要添加gunicorn和home(你自己設置的應用名)兩項。
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# add app
'bugapp',
'gunicorn',
)
3.運行gunicorn
#nohup gunicorn mysite.wsgi:application -b 127.0.0.1:1010&
nohup是後臺運行指令,詳細請查看:《nohup-真正的shell後臺運行》
當然,你也可以參考《鳥哥的linux私房菜(第三版)》,第17章第2節《脫機管理問題》
運行後可tail查看nohup.out文件,gunicorn的運行情況會輸出到這個文件中。
4.查看端口
#netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5414/nginx
tcp 0 0 127.0.0.1:1010 0.0.0.0:* LISTEN 5131/python3
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 30237/sshd
很明顯,gunicorn已經運行起來了,使用curl測試一下:
#curl 127.0.0.1:1010
這時候如果返回一個HTML頁面,說明gunicorn運行成功。接下來就是將gunicorn的WEB數據發送到發向代理服務器Nginx了,並由它發佈到Internet上接收訪問。
4.配置Nginx
打開Ngnix配置文件/etc/nginx/site-available/default文件,建議提前將原文件做個備份。將該文件修改成一下內容:
1 server{
2 listen 80;
3
4 server_name www.edse.cn;
5 location / {
6 proxy_pass http://127.0.0.1:1010;
7 proxy_set_header Host $host;
8 proxy_set_header X-Real-IP $remote_addr;
9 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10 }
11
12 location /static/{
13 root /data/testweb;
14 }
15 location /media/{
16 root /data/testweb;
17 }
18 }
保存後測試一下配置文件:
# nginx -t
nginx: [warn] conflicting server name "www.edse.cn" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
OK了!
5.最後重啓服務器
#service nginx restart
四.Gunload在代碼變更後的reload問題
修改過Django代碼後,需要重新建立gunicorn連接,否則頁面還是維持代碼變更前的狀態。當然我們可以採取兩種方法:
1.你可以KILL掉gunicorn進程,然後重新建立。但是費時費力,太麻煩,如果你在測試代碼頻繁變更,那無疑是巨大的工作量。
2.其實在gunicorn的19.0版本後已經加入了--reload選項,只要在運行gunicorn添加進去就可以了。如下:
#nohup gunicorn mysite.wsgi:application -b 127.0.0.1:1010 --reload&
加入--reload字段,就可以實時顯示變更代碼了