Django CentOS+Nginx+uWSGI環境下部署(含Nginx返回400問題處理、防火牆管理)

本文將介紹如何在Linux系統上部署Django web項目,本次部署基於下面的架構:html

CentOS7+ Python3.5 + Django1.11 + Nginx+uWSGI

親測可行!!按照本文步驟且根據實際狀況靈活部署,相信你們也能很快部署成功。話很少說,如今開始吧!node

首先,你得安裝CentOS或Redhat等Linux系統,物理機和虛擬機都行,若是是阿里雲ECS主機而且帶有獨立公網IP,那就更好。在這裏,我選用的是CentOS7,敬請參考。python

至於如何安裝CentOS七、Python3及其虛擬環境)、Django1.11,以及如何導出並安裝環境依賴庫(requirements.txt),不是本節的內容,請自行解決。下面是基於假定已將安裝好了上述三者。nginx

將Django項目移植到Linux系統中,進入Python虛擬環境,測試項目可否正常啓動:python manage.py runserver ServerIP:8000web

可能出現的問題:No module named '_sqlite3'sql

解決辦法:django

1.首先安裝sqlite-devel
yum install sqlite-develvim

2.從新編譯安裝Python3(進入Python解壓目錄執行下面的命令便可)
make
make install瀏覽器

安裝uWSGI

Django的主要部署平臺就是uWSGI,它也是Python的標準web應用服務器。uWSGI不支持Windows。安全

強烈建議使用:pip3 install uwsgi    (通常都是最新版本!如在極少狀況下不是最新版,則參考以下灰色部份內容)

到uWSGI官網下載之:https://uwsgi-docs.readthedocs.io/en/latest/Download.html,下載Stable/LTS最新穩定版本的源文件。

爲何要最新版?由於如今的官方教程和相關技術文章全是以新版編寫的,不少參數名,用法有較大改變。用舊版,偶爾有可能跑不起來。

我這裏下載的是uwsgi-2.0.17.1.tar.gz,等到你看到此文時,可能已經不是最新的了。

解壓源碼,而後指定安裝位置,將uwsgi安裝好:

# 解壓文件
tar -zxvf uwsgi-2.0.17.1.tar.gz
# 進入解壓目錄 python3 setup.py install

安裝完畢後,嘗試運行一下uWSGI:

[root@localhost wcw]# uwsgi

*** Starting uWSGI 2.0.17.1 (64bit) on [Thu Jul 26 11:14:57 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-28) on 25 July 2018 15:13:10
os: Linux-3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018
nodename: localhost.localdomain
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 2
current working directory: /home/wcw
detected binary path: /pyvenv/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 9592
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
The -s/--socket option is missing and stdin is not a socket.

雖然運行有警告,但至少代表你的uwsgi在系統可執行命令路徑中。

若是出現找不到命令的提示,那麼建議建立一個指向/usr/local/bin目錄的軟連接。

須要提醒你們注意的是權限的問題,該sudo的時候要sudo。還有讀寫權限,看看當前用戶是否具有相關文件的讀寫權限。

配置uWSGI

軟件安裝好了後,首先是要拷貝項目代碼。

由於我這裏是在Windows下使用Pycharm編寫的代碼,不是在CentOS虛擬機內編寫的代碼,因此須要將項目文件先總體移植到虛擬機中(我使用的是Xftp工具)。這個過程,各有奇招。OK,我如今把項目文件拷貝過去了。

在項目的根目錄下,也就是manage.py同級目錄下,新建一個uwsgi.ini "文件。文件名能夠隨便,但擴展名必須是".ini"。

在裏面寫入下面的配置內容:

[uwsgi]
socket = 192.168.1.2:8000                  #應用服務IP端口
chdir = /pyvenv/src/eduonline              #項目根目錄
module = eduonline.wsgi                #指定wsgi模塊,與Nginx鏈接時用
#http = IP:Port                            #web服務IP端口,uWSGI作web服務器時用
master = true                              #進程
processes = 4                              #進程數

#vhost = true                              #多站模式
#no-site = true                            #多站模式時不設置入口模塊和文件
#workers = 2                               #子進程數
#reload-mercy = 10
#vacuum = true                             #退出、重啓時清理文件
#max-requests = 1000
#limit-as = 512
#buffer-size = 30000

#進程文件,新建空文件便可,用於服務重啓、中止。如:
#重啓指令:uwsgi --restart [pidfile路徑]
#中止指令:uwsgi --stop [pidfile路徑]
pidfile = /pyvenv/src/eduonline/uwsgi.pid      
daemonize = /pyvenv/src/eduonline/uwsgi.log     #日誌文件,通常會自動建立
#disable-logging = true                         #不記錄正常信息,只記錄錯誤信息    

詳細說明:

  • 配置項中以"#"開頭的都是被註釋的項目;
  • chdir 是你的項目根目錄,這裏是eduonline;
  • module 是你的入口wsgi模塊,將eduonline替換成你的項目名稱;
  • socket 是通訊IP和端口設置;
  • master=True 表示以主進程模式運行;
  • demonize 是你的日誌文件,會自動建立;
  • disable-logging = true 表示只記錄錯誤信息,不然你的日誌可能很快就爆滿了!

測試:

[root@localhost /]# uwsgi --http :8888 --module eduonline.wsgi    // 配置文件中的module,隨便寫個其餘端口

如最後出現下面內容,則運行成功:

spawned uWSGI worker 1 (and the only) (pid: 5715, cores: 1)      // Ctrl+C結束

安裝Nginx

其實安裝Apache亦可,然而我選擇的是目前最流行的Nginx(>>查看Nginx的安裝部署?)。

如果Ubuntu,默認源裏面的Nginx版本比較舊,須要先添加一個Nginx的源,再經過apt-get安裝Nginx。

  sudo add-apt-repository ppa:nginx/stable
  apt-get update
  apt-get install nginx

通常這個都沒問題,Nginx是居家必備軟件,各家Linux下均可以順利安裝。

而後,經過ifconfig,查看一下你的Ubuntu虛擬機的ip地址,我這裏是192.168.1.2。使用同一局域網內的主機,經過瀏覽器訪問192.168.1.2或127.0.0.1,若是能看到下面的界面,說明Nginx服務正常。

配置Nginx

uWSGI安裝好了,就配置一下Nginx,編輯配置文件nginx.conf:

************************************************************************
關鍵是這一部分:

listen 88;                # 區別於uwsgi設置的端口
server_name www.wcwnina.com;     # 記得在系統的/etc/hosts文件中添加IP與域名的映射!

location / {
    include uwsgi_params;       # 與nginx.conf同目錄
    uwsgi_pass 192.168.1.2:8000;   # 與uwsgi配置中的socket一致
}

location /static {
    alias /pyvenv/src/eduonline/collectstatic;
}
************************************************************************

重點關注:"include"路徑必定要正確;"uwsgi_pass"的值必須與"uwsgi.ini"配置文件中的"socket"一致,且兩者的端口務必和"listen"端口不同!!

請將"server_name"改爲你的實際域名,"location  /static"alias改爲你的實際狀況。

修改完畢,保存退出,而後重啓nginx服務:

nginx -s reload

# 其餘指令
啓動服務:nginx
退出服務:nginx -s quit
強制關閉服務:nginx -s stop
重啓服務:nginx -s reload
驗證配置文件:nginx -t
使用配置文件:nginx -c "配置文件路徑"
使用幫助:nginx -h

啓動服務

下面咱們能夠嘗試啓動uwsgi服務啦(參考使用systemctl管理服務[往下翻])! 進入有uwsgi.ini文件的目錄,運行:

啓動:uwsgi --ini uwsgi.ini

重啓:uwsgi --restart uwsgi.pid  中止:uwsgi --stop uwsgi.pid
(修改過配置文件必須重啓)

系統提示:

  [uWSGI] getting INI configuration from uwsgi.ini

到主機瀏覽器中訪問'192.168.1.2',卻看見下面的錯誤提示頁面:

DisallowedHost at /
Invalid HTTP_HOST header: '192.168.1.2'. You may need to add '192.168.1.2' to ALLOWED_HOSTS.
Request Method: GET
Request URL: http://192.168.1.2/
Django Version: 1.11.3
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: '192.168.1.2'. You may need to add '192.168.1.2' to ALLOWED_HOSTS.
Exception Location: /usr/local/lib/python3.5/dist-packages/django/http/request.py in get_host, line 113
Python Executable: /usr/local/bin/uwsgi
Python Version: 3.5.4
......

不要被它們嚇到!不少人都不肯意仔細看錯誤信息,其實解決辦法,人家已經提示得很是清楚了,須要在ALLOWED_HOSTS配置項目中添加'192.168.1.2'。

進入相應目錄,編輯settings.py文件:

DEBUG = False
ALLOWED_HOSTS = ['192.168.1.2']

同時將DEBUG設置爲False。

在CentOS中,運行下面的命令:

  killall -9 uwsgi

這會刪除先前的uwsgi進程。 過幾秒,必定要過幾秒,數5下,而後:

  uwsgi --ini uwsgi.ini

爲何要過幾秒?由於端口釋放有延遲啦。

再次在瀏覽器中訪問域名"www.wcwnina.com:88"或"192.168.1.2",就會看到你部署的網站首頁(下圖是我本人親自開發的網站,你看到的以你實際部署的網站爲準):

 OK,大功告成!至此一個Django web項目就在Linux系統上部署好了。但這尚未結束,還有靜態文件配置、密鑰文件處理、服務自啓動(往下翻)等等,你們見諒,那我這裏先不作贅述吧。

解決一個意外問題

除了"400 Bad Request",啥狗屁錯誤提示也沒有!百度了好久,幾乎全是說http請求頭報文的格式有誤或字長超出最大限制,按步驟處理後,仍然不能解決問題。由於雖然http狀態碼一致,但引起問題的緣由極可能不同。

問題截圖:

 

緣由:不當心將Nginx的監聽端口ListenuWSGI配置的端口寫成同樣了。處理辦法:將它們設爲不同。

(附1) 通常Linux開啓外網訪問配置

在Linux系統中默認有防火牆Iptables管理者全部的端口,只啓用默認遠程鏈接22端口其餘都關閉,我們上面設置的80等等也是關閉的,因此咱們須要先把應用的端口開啓。

方法1

直接關閉防火牆,這樣性能較好,但安全性較差,若是有前置防火牆能夠採起這種方式。

關閉防火牆
[root@localhost ~]# service iptables stop
關閉開機自啓動防火牆
[root@localhost ~]# chkconfig iptables off
[root@localhost ~]# chkconfig --list|grep ipt

方法2

將開啓的端口加入防火牆白名單中,這種方式較安全但性能也相對較差。

編輯防火牆白名單
[root@localhost ~]# vim /etc/sysconfig/iptables
增長下面一行代碼
-A INPUT -p tcp -m state -- state NEW -m tcp --dport 80 -j ACCEPT
保存退出,重啓防火牆
[root@localhost ~]# service iptables restart

 (附2) CentOS 7防火牆管理

CentOS 7.0默認使用的是firewall做爲防火牆, 使用systemctl來管理服務和程序,包括了service和chkconfig。

一、查看防火牆狀態

[root@localhost ~]# firewall-cmd --state
running

二、關閉防火牆

[root@localhost ~]# systemctl stop firewalld.service    //中止firewall,.service可省略
[root@localhost ~]# systemctl disable firewalld         //禁止firewall開機啓動

三、開啓防火牆

[root@localhost ~]# systemctl start firewalld           //啓動firewall
[root@localhost ~]# systemctl restart firewalld //重啓firewall [root@localhost ~]# systemctl enable firewalld //開機時啓動firewall

四、在開啓防火牆前提下,開放某個端口

查看全部打開的端口
[root@localhost ~]# firewall-cmd --list-port --permanent    (查看永久的端口,後面加上"--permanent")

添加 [root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent ("--permanent"永久生效,沒有此參數重啓後失效)
從新載入 [root@localhost ~]# firewall-cmd --reload
刪除 [root@localhost ~]# firewall-cmd --remove-port=80/tcp --permanent

修改後須要重啓防火牆服務。 

 

  至此。轉載請註明出處。

本站相關連接:>>Windows環境下部署Django ]

,與Nginx
相關文章
相關標籤/搜索