本文將介紹如何在Linux系統上部署Django web項目,本次部署基於下面的架構:
Linux(CentOS7)+ Python3.5 + Django1.11 + Nginx + uWSGI
親測可行!!按照本文步驟且根據實際情況靈活部署,相信大家也能很快部署成功。話不多說,現在開始吧!
首先,你得安裝CentOS或Redhat等Linux系統,物理機和虛擬機都行,如果是阿里雲ECS主機並且帶有獨立公網IP,那就更好。在這里,我選用的是CentOS7,敬請參考。
至於如何安裝CentOS7、Python3(及其虛擬環境)、Django1.11,以及如何導出並安裝環境依賴庫(requirements.txt),不是本節的內容,請自行解決。下面是基於假定已將安裝好了上述三者。
將Django項目移植到Linux系統中,進入Python虛擬環境,測試項目能否正常啟動:python manage.py runserver ServerIP:8000
可能出現的問題:No module named '_sqlite3'
解決辦法:
1.首先安裝sqlite-devel
yum install sqlite-devel
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。
1、查看防火牆狀態
[root@localhost ~]# firewall-cmd --state
running
2、關閉防火牆
[root@localhost ~]# systemctl stop firewalld.service //停止firewall,.service可省略 [root@localhost ~]# systemctl disable firewalld //禁止firewall開機啟動
3、開啟防火牆
[root@localhost ~]# systemctl start firewalld //啟動firewall
[root@localhost ~]# systemctl restart firewalld //重啟firewall [root@localhost ~]# systemctl enable firewalld //開機時啟動firewall
4、在開啟防火牆前提下,開放某個端口
查看所有打開的端口 [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