[toc]
# Web應用部署
在我的阿里云主機部署Django之web項目,基本的部署架構是,Ngix -> uWSGI -> Django,安裝和配置參考[Django Nginx+uwsgi 安裝配置](http://www.runoob.com/django/django-nginx-uwsgi.html)和[Python uWSGI 安裝配置](http://www.runoob.com/python3/python-uwsgi.html)。
* Nginx是Web服務器
* uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。[參考uWSGI、WSGI和uwsgi](https://www.cnblogs.com/wspblog/p/8575101.html)
* Django是WEB App框架
以下是Django項目的目錄(PyCharm構建)
```
./MyDjangoProject
└───myapp
└───mysite
└───myusers
└───static
└───venv
│ db.sqlite3
│ manage.py
│ ...
```
以下是阿里云主機的相關目錄
```
/root
└───downloads
│ │ ...
│
└───qb_web_prj
└───ex_nginx_conf # nginx的相關配置文件
└───ex_wsgi # uWSGI的相關文件
└───MyDjangoProject # 我的Django項目
└───qb_venv #虛擬環境venv
```
## Virtualenv(Python虛擬環境)
`virtualenv`is a tool to create isolated Python environments.virtualenv?是一個創建隔絕的Python環境的工具。[virtualenv安裝使用簡介](https://www.cnblogs.com/technologylife/p/6635631.html)
1. 安裝virtualenv
```
apt install virtualenv
```
2. 創建一個虛擬環境
~~~
$ cd my_project_dir
$ virtualenv venv #venv為虛擬環境目錄名,目錄名自定義
$ virtualenv -p /usr/bin/python2.7 venv # -p參數指定Python解釋器程序路徑
~~~
2. 要開始使用虛擬環境,其需要被激活:
~~~
$ source venv/bin/activate
~~~
`從現在起,任何你使用pip安裝的包將會放在?venv`?文件夾中,與全局安裝的Python隔絕開。
像平常一樣安裝包,比如:
~~~
$ pip install requests
~~~
3. 如果你在虛擬環境中暫時完成了工作,則可以停用它:
~~~
$ . venv/bin/deactivate
~~~
這將會回到系統默認的Python解釋器,包括已安裝的庫也會回到默認的。
要刪除一個虛擬環境,只需刪除它的文件夾。(執行?`rm?-rf?venv`?)。
這里virtualenv 有些不便,因為virtual的啟動、停止腳本都在特定文件夾,可能一段時間后,你可能會有很多個虛擬環境散落在系統各處,你可能忘記它們的名字或者位置。
* 安裝virtualenv問題的處理
[# virtualenv setuptools pkg\_resources pip wheel failed with error code 2](https://blog.csdn.net/hymanjack/article/details/80341943)
## 在我的阿里云主機部署Django項目
0. 安裝虛擬環境virtualenv,啟動虛擬環境,在虛擬環境中安裝Django
```
(qb_venv) root@xxxx:~:python --version
Python 3.5.2
```
### Django項目部署測試
1. 把PyCharm建立的django項目上傳至阿里云主機
2. 用python manage.py runserver 0.0.0.0:9000命令運行django程序后,通過瀏覽器訪問服務器網址的9000端口,出現訪問錯誤,報錯為
`Invalid HTTP_HOST header: ‘xxx.xx.xxx.xxx:9000’. You may need to add ‘xxx.xx’ to ALLOWED_HOSTS`。
解決辦法是:修改django項目的setting.py文件
將`ALLOWED_HOSTS = []`改為`ALLOWED_HOSTS = ['*']`,
3. 運行我的django項目`python manage.py runserver 0.0.0.0:9000`
正常的話,在瀏覽器輸入 **http://ip:9000**,可以看到自己頁面。
### uWSGI安裝測試
1. [Python uWSGI 安裝配置](http://www.runoob.com/python3/python-uwsgi.html)
2. 按以上推薦的方法新建一個簡單的web處理程序,然后啟動http服務(
**uwsgi --http :9000 --wsgi-file foobar.py**)
正常的話,在瀏覽器輸入 **http://ip:9000**,可以看到自己頁面。
### Nginx WEB服務器安裝測試
1. [阿里云Ubuntu 16.04系統下安裝Nginx](https://www.jianshu.com/p/cee284a90c0e)
2. 啟動Nginx,進入Nginx的安裝目錄,也就是剛才我們配置的`/usr/local/nginx`下的`sbin`目錄下執行`./nginx`
3. Nginx端口默認端口為80,我們可以通過配置的IP或者域名進行訪問,出現下圖,說明Nginx啟動成功,或者通過`ps -ref |grep nginx`查看Nginx的進程得知Nginx是否啟動成功!
4. Nginx的配置文件為`/etc/nginx/nginx.conf`
5. Nginx的常用命令
* 關閉命令:`./nginx -s stop`
* 退出命令:`./nginx -s quit`,等程序執行完畢后關閉,建議使用此命令。
* 動態加載配置文件`./nginx -s reload`可以不關閉Nginx的情況下更新配置文件,非常好用!
* 查看Nginx版本:`./nginx -v`
### 部署Django項目@Nginx
Django,uWSGI,Nginx分別安裝測試OK,下面就配置相關文件
1. 配置uwsgi的ini文件
我這里的uwsgi配置文件qbuwsgi.ini
```
[uwsgi]
# 對外提供 http 服務的端口
# http = :9000
#the local unix socket file than commnuincate to Nginx 用于和 nginx 進行數據交互的端口
#socket=/data/wwwroot/DevOps/uwsgi/uwsgi.sock
socket = 127.0.0.1:9008
# the base directory (full path) django 程序的主目錄
chdir=/root/qb_web_prj/MyDjangoProject
# Django's wsgi file
#module=mysite.wsgi:application
wsgi-file = mysite/wsgi.py
# maximum number of worker processes
processes = 4
#thread numbers startched in each worker process
threads = 2
#monitor uwsgi status 通過該端口可以監控 uwsgi 的負載情況
stats = 127.0.0.1:9191
# clear environment on exit
vacuum = true
# 后臺運行,并輸出日志
daemonize = /var/log/uwsgi.log
# 在定義的文件夾內創建uwsgi.pid(該pid文件保存了uwsgi的進程號,用來重啟和停止uwsgi服務)和uwsgi.status(用來查看uwsgi的服務狀態)
# stats = %(chdir)/uwsgi/uwsgi.status # 注意這里用的是相對地址,以下定義的是絕對地址
stats = /root/qb_web_prj/ex_wsgi/uwsgi.status
pidfile = /root/qb_web_prj/ex_wsgi/uwsgi.pid
```
2. 啟動uwsgi
uwsgi --ini qbuwsgi.ini,這樣就啟動了uwsgi
如何啟動停止uwsgi參考[uwsgi服務啟動(start)停止(stop)重新裝載(reload)](https://blog.51cto.com/12482328/2087535)
* `uwsgi --ini qbuwsgin.ini` # 啟動
* `uwsgi --reload 路徑/uwsgi.pid` # 重啟
* `uwsgi --connect-and-read 路徑/uwsgi.status` # 查看運行狀態
* `uwsgi --stop uwsgi/uwsgi.pid` #停止
* `ps aux | grep uwsgi` # 查看uwsgi的進程
3. 新建nginx配置文件
nginx的配置文件是`/etc/nginx/nginx.conf`,配置文件nginx.conf摘要如下:
```
http {
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
```
注意到該配置文件包含了/etc/nginx/sites-enabled/下的相關文件,把自己的相關配置文件放這里就好,這里我是這么處理的:新建文件/root/qb_web_prj/ex_nginx_conf/qb-django-nginx.conf,
然后把該文件軟連接至/etc/nginx/sites-enabled/,qb-django-nginx.conf內容如下:
```
server {
listen 9007;
#web服務對外端口地址,即http訪問端口號
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9008;
#對應uwsgi的輸入端口號
uwsgi_param UWSGI_SCRIPT mysite.wsgi;
uwsgi_param UWSGI_CHDIR /root/qb_web_prj/MyDjangoProject/mysite;
index index.html index.htm;
client_max_body_size 35m;
}
}
```
4. 啟動nginx
uwsgi已經啟動了,nginx的配置文件也已經準備就緒,現在就可以啟動nginx了:
輸入命令`nginx`即可
nginx的常用命令如下:
* nginx -t # 啟動 Nginx
* nginx -t # 檢查配置文件nginx.conf的正確性命令
* nginx -s reload # 重新載入配置文件
* nginx -s reopen # 重啟 Nginx
* nginx -s stop # 停止 Nginx
5. 瀏覽器查看結果
在瀏覽器輸入http://xxx.xxx.xxx.xxx:9007就能看到django項目的展示!
大概流程是這樣的:
1. 瀏覽器向http://xxx.xxx.xxx.xxx:9007發送請求;
2. nginx web服務器在端口號9007收到請求后,把請求通過socket = 127.0.0.1:9008
轉發給了uwsgi服務端;
3. uwsgi服務端與django項目交互后再把結果原路反饋給瀏覽器,用戶就可以在瀏覽器看到結果了!!!