前提條件python
在咱們開始安裝Nginx及其餘所需軟件以前先安裝一些前提軟件。首先,咱們須要PIP與virtualenv:nginx
sudo apt-get install python-setuptools sudo easy_install pip sudo pip install virtualenv
安裝並運行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
打開瀏覽器訪問你的服務器,你應該能看到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)
讓咱們執行咱們剛建立的腳本:app
python hello.py
如今你能夠經過瀏覽器訪問你服務器的8080端口,看,應用生效了:
注意:由於80端口已被Nginx使用,這裏我使用8080端口。
如今應用是由Flask內置的web服務託管的,對於開發和調試這確實是個不錯的工具,但不推薦在生產環境中使用。讓咱們配置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
訪問服務器的公共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配置文件/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
執行uWSGI,用新建立的配置文件做爲參數:
uwsgi --ini /var/www/demoapp/demoapp_uwsgi.ini
接下來訪問你的服務器,如今Nginx能夠鏈接到uWSGI進程了:
咱們如今基本完成了,惟一剩下的事情是配置uWSGI在後臺運行,這是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
參考文章,
感謝分享