Django+gunicorn+Nginx環境的搭建

一.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字段,就可以實時顯示變更代碼了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章