Django部署:Django+gunicorn+Nginx環境的搭建

本人的服務器環境爲Ubuntu14.04,使用的是Python3.4版本,而且安裝有pip(Ubuntu中Python3配合的是pip3),而且以管理員身份運行,若是是普通用戶,請切換管理員權限(sudo)。 html

一.gunicorn和nginx的簡介

gunicorn須要搭配nginx使用,那麼二者的做用究竟是什麼。 python

1.gunicorn簡介:gunicorn是一個Python WSGI UNIX服務器。WSGI(Web Server Gateway Interface)是Web服務網關接口,位於WEB應用層和WEB服務器層之間。在這裏WEB應用固然是指Python解釋器及Django編寫的程序,而WEB服務器指的是Nginx,因此Gunicorn位於二者之間。 linux

2.Nginx簡介:Nginx是反向代理服務器,接收外部Internet網絡請求,並將請求轉發給內部網絡的WSGI,並將響應信息反饋給外部Internet用戶。因此gunicorn就是起到溝通做用,將Django和Nginx聯繫起來,也就是咱們說的網關做用。 nginx

二.Django,Gunicorn,Nginx的安裝

在這裏咱們使用的是Django最新版本1.8.4,固然,你也能夠選擇其餘版本。 web

#pip3 install Django==1.8.4 shell

#pip3 install gunicorn django

#apt-get install python-dev nginx 服務器

三.環境搭建與測試

1.建立Django項目 網絡

建立mysite項目 session

#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字段,就能夠實時顯示變動代碼了。


參考文獻:

《django 部署,gunicorn、virtualenv、nginx》

《Django 部署(nginx)

《gunicorn autoreload on source change》

相關文章
相關標籤/搜索