Ubuntu+Flask + Nginx + uWSGI + uWSGI Emperor

前提條件python

在咱們開始安裝Nginx及其餘所需軟件以前先安裝一些前提軟件。首先,咱們須要PIP與virtualenv:nginx

sudo apt-get install python-setuptools
sudo easy_install pip
sudo pip install virtualenv

Nginx

安裝並運行Nginx:web

sudo apt-get install nginx
sudo /etc/init.d/nginx start

Nginx是一個提供靜態文件訪問的web服務,然而,它不能直接執行託管Python應用程序,而uWSGI解決了這個問題。讓咱們先安裝uWSGI,稍候再配置Nginx和uWSGI之間的交互。flask

sudo pip install uwsgi

里程碑 #1

打開瀏覽器訪問你的服務器,你應該能看到Nginx歡迎頁:ubuntu

示例應用

咱們將託管的應用是經典的「Hello, world!」。這個應用只有一個頁面,已經猜到頁面上將有什麼內容了吧。將全部應用相關的文件存放在/var/www/demoapp文件夾中。下面建立這個文件夾並在其中初始化一個虛擬環境:segmentfault

sudo mkdir /var/www
sudo mkdir /var/www/demoapp

因爲咱們使用root權限建立了這個文件夾,它目前歸root用戶全部,讓咱們更改它的全部權給你登陸的用戶(個人例子中是ubuntu)瀏覽器

sudo chown -R ubuntu:ubuntu /var/www/demoapp/

建立並激活一個虛擬環境,在其中安裝Flask:安全

cd /var/www/demoapp
virtualenv venv
. venv/bin/activate
pip install flask

 

使用下面的代碼建立hello.py文件:服務器

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

 

里程碑 #2

讓咱們執行咱們剛建立的腳本:app

python hello.py

 

如今你能夠經過瀏覽器訪問你服務器的8080端口,看,應用生效了:

注意:由於80端口已被Nginx使用,這裏我使用8080端口。

如今應用是由Flask內置的web服務託管的,對於開發和調試這確實是個不錯的工具,但不推薦在生產環境中使用。讓咱們配置Nginx來挑起這個重擔吧。

配置Nginx

首先刪除掉Nginx的默認配置文件:

sudo rm /etc/nginx/sites-enabled/default

 

注意:若是你安裝了其餘版本的Nginx,默認配置文件可能在/etc/nginx/conf.d文件夾下。

建立一個咱們應用使用的新配置文件/var/www/demoapp/demoapp_nginx.conf:

server {
    listen      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/demoapp_uwsgi.sock;
    }
}

 

將剛創建的配置文件使用符號連接到Nginx配置文件文件夾中,重啓Nginx:

sudo ln -s /var/www/demoapp/demoapp_nginx.conf /etc/nginx/conf.d/
sudo /etc/init.d/nginx restart

 

里程碑 #3

訪問服務器的公共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」錯誤,讓咱們立刻修正它吧。

配置uWSGI

建立一個新的uWSGI配置文件/var/www/demoapp/demoapp_uwsgi.ini:

[uwsgi]
#application's base folder
base = /var/www/demoapp

#python module to import
app = hello
module = %(app)

home = %(base)/venv
pythonpath = %(base)

#socket file's location
socket = /var/www/demoapp/%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

 

里程碑 #4

執行uWSGI,用新建立的配置文件做爲參數:

uwsgi --ini /var/www/demoapp/demoapp_uwsgi.ini

 

接下來訪問你的服務器,如今Nginx能夠鏈接到uWSGI進程了:

咱們如今基本完成了,惟一剩下的事情是配置uWSGI在後臺運行,這是uWSGI Emperor的職責。

 

uWSGI Emperor

uWSGI Emperor (很拉風的名字,是不?) 負責讀取配置文件而且生成uWSGI進程來執行它們。建立一個初始配置來運行emperor

新建/etc/systemd/system/emperor.uwsgi.service文件,代碼以下:

[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
#uwsgi 服務的路徑,以及須要啓動的 ini 文件路徑,根據本身的實際狀況進行修改
ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

上述代碼中,/etc/uwsgi/emperor.ini 文件的代碼以下:

[uwsgi]
emperor = /etc/uwsgi/vassals
uid = www-data
gid = www-data

把網站的 uwsgi.ini 文件要給個軟鏈,加到 /etc/uwsgi/vassals/ 文件夾中:

sudo mkdir /etc/uwsgi && sudo mkdir /etc/uwsgi/vassals
sudo ln -s /var/www/demoapp/demoapp_uwsgi.ini /etc/uwsgi/vassals

同時,最後一行說明用來運行守護進程的用戶是www-data。爲簡單起見,將這個用戶設置成應用和日誌文件夾的全部者。

sudo chown -R www-data:www-data /var/www/demoapp/
sudo chown -R www-data:www-data /var/log/uwsgi/

注意:咱們先前安裝的Nginx版本使用「www-data」這個用戶來運行Nginx,其餘Nginx版本的可能使用「Nginx」這個替代用戶。

因爲Nginx和uWSGI都由同一個用戶運行,咱們能夠在uWSGI配置中添加一個安全提高項。打開uWSGI配置文件,將chmod-socket值由666更改成644:

...
#permissions for the socket file
chmod-socket    = 644

運行服務、中止服務、狀態查詢:

systemctl start emperor.uwsgi.service
systemctl stop emperor.uwsgi.service
systemctl status emperor.uwsgi.service 

 

參考文章,

感謝分享

在 Ubuntu 上使用 Nginx 部署 Flask 應用

Debian8 + Flask + Nginx + uWSGI + uWSGI Emperor 基本配置文件注意事項

相關文章
相關標籤/搜索