1.操作系統環境:Ubuntu Server 16.04.1 LTS 64位
2.安裝前准備:
(1)安裝 Python 環境
接下來是python , Ubuntu 的默認環境已經預裝 python 2.7 所以只需要安裝 python 的 pip 安裝工具即可。pip 用於安裝一些基於python 應用的軟件工具,在下文中將會頻繁使用。
PIP
如果用python 而不懂 [pip|http://pypi.python.org/] 那最好就快點腦補吧, 指令如下:
sudo apt-get install pip
(2)VirtualEnv
不同的項目可能會引用各種不同的依賴包,為了避免版本與和應用之間的沖突而造成的“依賴地獄”
[Virtualenv | https://virtualenv.readthedocs.org/en/latest/] 就是我們python 項目的必須品了。VirtualEnv 可以為每個Python應用創建獨立的開發環境,使他們互不影響,Virtualenv 能夠做到:
- 在沒有權限的情況下安裝新套件
- 不同應用可以使用不同的套件版本
- 套件升級不影響其他應用
安裝:
sudo pip install virtualenv
(3)安裝Nginx
安裝並運行Nginx:
sudo apt-get install nginx
sudo /etc/init.d/nginx start
Nginx是一個提供靜態文件訪問的web服務,然而,它不能直接執行托管Python應用程序,而uWSGI解決了這個問題。讓我們先安裝uWSGI,稍候再配置Nginx和uWSGI之間的交互。
(4)安裝uWSGI
sudo pip install uwsgi
3.部署與創建文件結構:
(1)我們將托管的應用是經典的“Hello, world!”。這個應用只有一個頁面,已經猜到頁面上將有什么內容了吧。將所有應用相關的文件存放在/var/www文件夾中。下面創建這個文件夾並在其中初始化一個虛擬環境:
sudo mkdir /var/www
(2)由於我們使用root權限創建了這個文件夾,它目前歸root用戶所有,讓我們更改它的所有權給你登錄的用戶(我的例子中是ubuntu)://給權限這步非常重要
sudo chown -R ubuntu:ubuntu /var/www/
(3)創建並激活一個虛擬環境,在其中安裝Flask:也可以不加sudo,如果失敗的話就加上sudo再試一次
cd /var/www //進入web所在文件夾
#coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8080)
(5)測試腳本,讓我們執行我們剛創建的腳本,在/var/www目錄下執行:python hello.py
注意:因為80端口已被Nginx使用,這里我使用8080端口。
現在應用是由Flask內置的web服務托管的,對於開發和調試這確實是個不錯的工具,但不推薦在生產環境中使用。讓我們配置Nginx來挑起這個重擔吧。
(6)配置Nginx
直接替換掉,/etc/nginx/sites-enabled/目錄下的,default文件
創建新的default文件:
server {
listen 80; //監聽80端口
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/var/www/demoapp_uwsgi.sock; //目前沒有,隨后配置該文件
}
}
用新建的default文件替換掉原來/etc/nginx/sites-enabled/目錄下的,default文件后,重啟服務:
sudo /etc/init.d/nginx restart
(7)訪問服務器的公共ip地址,你會看到一個錯誤:
別擔心,這個錯誤是正常的,它代表Nginx已經使用了我們新創建的配置文件,但在鏈接到我們的Python應用網關uWSGI時遇到了問題。到uWSGI的鏈接在Nginx配置文件的第10行定義:
uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;
這代表Nginx和uWSGI之間的鏈接是通過一個socket文件,這個文件位於/var/www/demoapp/demoapp_uwsgi.sock。因為我們還沒有配置uWSGI,所以這個文件還不存在,因此Nginx返回“bad gateway”錯誤,讓我們馬上修正它吧。
(8)配置uWSGI:在/var/www目錄下創建一個文件:demoapp_uwsgi.ini:
[uwsgi]
#application's base folder
base = /var/www
#python module to import
app = hello
module = %(app)
home = %(base)/venv
pythonpath = %(base)
#socket file's location
socket = /var/www/%n.sock
#permissions for the socket file
chmod-socket = 666
#the variable that holds a flask application inside the module imported at line #6
callable = app
#location of log files
logto = /var/log/uwsgi/%n.log
創建一個新文件夾存放uWSGI日志,更改文件夾的所有權:
sudo mkdir -p /var/log/uwsgi
sudo chown -R ubuntu:ubuntu /var/log/uwsgi
(9)在/var/www目錄下執行uWSGI,用新創建的配置文件作為參數:
uwsgi --ini /var/www/demoapp_uwsgi.ini
接下來訪問你的服務器,現在Nginx可以連接到uWSGI進程了:
我們現在基本完成了,唯一剩下的事情是配置uWSGI在后台運行;
到目前為止,/var/www下的文件結構如下:
4.現在我們讓它在后台運行,要使其隨同服務器啟動並作為后台服務運行才是運營環境的實際所需要。因此接下來我們需要安裝另一個工具來引導 uwsgi 。