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
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的監聽端口Listen與uWSGI配置的端口寫成同樣了。處理辦法:將它們設爲不同。
(附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 ]