參考:https://www.cnblogs.com/vijayfly/p/6290773.html
思路:修改uwsgi的ini配置文件,把http換為socket就可以了。Nginx的配置文件在/etc/nginx/config/config.d/下面。利用nginx監聽的9000端口http協議訪問,讓后利用socket協議,轉發到uwsgi監聽的8001端口上,讓后通信就可以了。
兩個配置文件
uwsig.ini文件
[uwsgi]
# manage.py文件所在目錄
chdir=/root/flask
callable=app
# flask文件名
wsgi-file=server5.py
# 進程數
processes=2
# 使用5001端口
socket=127.0.0.1:5001
# 日志輸出目錄
daemonize=/root/flask/flask.log
pidfile=project-master.pid
stats=127.0.0.1:9191
default.conf文件
server {
listen 9000;
server_name localhost;
charset utf-8;
access_log /root/flask/access.log;
error_log /root/flask/error.log;
client_max_body_size 100M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:5001;
uwsgi_param UWSGI_PYHOME /usr/bin/python3;
uwsgi_param UWSGI_CHDIR /root/flask;
uwsgi_param UWSGI_SCRIPT server5:app;
}
}
uwsgi uwsig.ini
Service nginx start
Service nginx retart #stop
Killall -9 uwsig
ps -ef|grep nginx
ps -ef|grep uwsig
netstat -tunlp|grep nginx
netstat -tunlp|grep uwsig
nginx的權限問題(13: Permission denied)解決辦法
補充問題:有時啟動nginx,運行后有問題,查看log日志
4.1、查看當前selinux的狀態。
1. /usr/sbin/sestatus
4.2、將SELINUX=enforcing 修改為 SELINUX=disabled 狀態。
1. vi /etc/selinux/config
2. #SELINUX=enforcing
3. SELINUX=disabled
4.3、重啟生效。reboot。
1. reboot
.安裝uwsgi
ubuntu有uwsgi的ppa
add-apt-repository ppa:stevecrozz/ppa apt-get update apt-get install uwsgi
2. 用uwsgi代替mod_wsgi
nginx的整體配置說來話長,我也不再羅嗦了,假設已經明白nginx的基本配置,那么uwsgi就類似這么配置:
location / { include uwsgi_params uwsgi_pass 127.0.0.1:9090 }
這就是把所有url傳給9090端口的uwsgi協議程序來互動。
再到project目錄建立myapp.py,使得application調用框架的wsgi接口,比如web.py就是
...... app=web.application(urls, globals()) application=app.wsgifunc()
再比如django就是
....... from django.core.handlers.wsgi import WSGIHandler application=WSGIHandler()
然后運行uwsgi監聽9090,其中-w后跟模塊名,也就是剛才配置的myapp
uwsgi -s :9090 -w myapp
運行網站發現已經部署完成了。
3. uwsgi的參數
以上是單個project的最簡單化部署,uwsgi還是有很多令人稱贊的功能的,例如
并發4個線程
uwsgi -s :9090 -w myapp -p 4
主控制線程+4個線程
uwsgi -s :9090 -w myapp -M -p 4
執行超過30秒的client直接放棄
uwsgi -s :9090 -w myapp -M -p 4 -t 30
限制內存空間128M
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128
服務超過10000個req自動respawn
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000
后臺運行等
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
4.為uwsgi配置多個站點
為了讓多個站點共享一個uwsgi服務,必須把uwsgi運行成虛擬站點:去掉“-w myapp”加上”-vhost”
uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost
然后必須配置virtualenv,virtualenv是python的一個很有用的虛擬環境工具,這樣安裝
apt-get install python-setuptools easy_install virtualenv
然后設置一個/多個app基準環境
virtualenv /var/www/myenv
應用環境,在此環境下安裝的軟件僅在此環境下有效
source /var/www/myenv/bin/activate pip install django pip install mako ...
最后配置nginx,注意每個站點必須單獨占用一個server,同一server不同location定向到不同的應用不知為何總是失敗,我猜也算是一個bug。
server { listen 80; server_name app1.mydomain.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_PYHOME /var/www/myenv; uwsgi_param UWSGI_SCRIPT myapp1; uwsgi_param UWSGI_CHDIR /var/www/myappdir1; } } server { listen 80; server_name app2.mydomain.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_PYHOME /var/www/myenv; uwsgi_param UWSGI_SCRIPT myapp2; uwsgi_param UWSGI_CHDIR /var/www/myappdir2; } }
如此這般,重啟nginx服務,兩個站點就可以共用一個uwsgi服務了。
5.實戰應用
最初的設置完畢以后,再添加的應用,只需要在nginx里面進行少量修改,無需重啟uwsgi,就能立刻部署完畢。uwsgi自帶了基于django的監控uwsgi運行狀態的工具,就拿它來部署好了:
server {
listen 80;
root /var/www/django1.23;
index index.html index.htm;
server_name test.uwsg.com;
access_log /var/log/nginx/django.access.log;
location /media/ {
root /var/www/django;
rewrite ^/media/(.*)$ / break;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
uwsgi_param UWSGI_PYHOME /var/www/django;
uwsgi_param UWSGI_CHDIR /var/www/django;
uwsgi_param UWSGI_SCRIPT uwsgiadmin_wsgi;
}
}
于是uwsgi的監控信息可以在http://test.uwsg.com 看到用戶名密碼都是admin。
境:Cent7.5+Django2.1.2+uwsgi2.0.17+nginx1.12.2
1.uwsgi協議說明
uwsgi 是基于wsgi 協議的一個應用。wsgi 是網頁服務器網關接口協議,用來處理http request、response的消息。
uwsgi 2.0.17 基于python2 下的pip install uwsgi 來安裝,可以通過xml或ini文件格式來做初始化配置。
2.應用說明
這里用ini配置。conf.ini內容如下:
[uwsgi] socket=:8080 chdir=/home/website/hourseWebSiteProject #wsgi-file=hourseWebSiteProject/wsgi.py module=hourseWebSiteProject.wsgi pidfile=pid.uwsgi master=true processes=4 threads=2 buffer-size=32768 virtualenv=/home/website/ll_env daemonize=UWSGI.log vacuum=true
socket=:8080 是用來配置nginx 服務器,用來建立socket通信的,如果單獨啟用測試運行django服務器,讓外網訪問設置為http=:8080 。指定任何地址可以訪問。
chidir 用來指定Django的項目目錄。
module 指定wsgi文件
virtualenv 指定安裝的Python3 安裝的虛擬環境,運行uwsgi 協議應用是在虛擬環境目錄下進行的.
命令:source ll_env/bin/activate
/home/website/ll_env 為建立的虛擬環境目錄路徑,此處使用的是python3.5+django 2.0.7環境
daemonize 指定uwsgi運行在后臺
2.1 啟用uwsgi
uwsgi --ini conf.ini #以上命令啟用uwsgi,用cat UWSGI.log 查看當前目錄下uwsgi生成的日志信息是什么 netstat -ntlp #此命令查看端口8080 隊友的uwsgi 服務是否啟用。
2.3 關閉uwsgi
(ll_env) [root@192 hourseWebSiteProject]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:10022 0.0.0.0:* LISTEN 999/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1641/nginx: master tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1628/uwsgi tcp6 0 0 :::10022 :::* LISTEN 999/sshd tcp6 0 0 :::3306 :::* LISTEN 1037/mysqld #查找到 uwsgi 的進程號PID 1628 用以下命令關閉 kill -9 1628
1. nginx介紹
nginx是web應用中繼服務器用來轉發網頁請求,將網頁請求轉發為uwsgi 網關應用。
當uwsgi配置啟動成功后,需要配置nginx。
首先Django 項目的工程下的setting.py 下的DEBUG=True 。如果DEBUG 改為False ,Django 項目就不能自動索引Static靜態文件了,這個時候就通過nginx來提供靜態文件的目錄了,同時template 中的網頁模板中的引入文件路徑就要修改了。
<script src="{%static 'lib/jquery.js'%}" type="text/javascript"> 此處我們配置的是static最為根目錄,
所以改為<script src="/static/lib/jquery.js" type="text/javascript"/>
在setting.py 中將DEBUG=True改為DEBUG=False。Django 就不再索引原有的靜態文件目錄了。
在setting.py 底部添加STATIC_ROOT='/var/www' 。設置我們靜態文件存儲目錄,文件夾如果不存在就創建。
然后用命令
python3 manage.py collectstatic #此命令將項目和App 下所有的static目錄統一收集到STATIC_ROOT標識的目錄下
2. nginx 應用
2.1 nginx 使用
nginx version: nginx/1.12.2
此處版本是1.12.2 配置文件存放在/usr/local/nginx/conf/nginx.conf 路徑下
修改nginx.conf 中的server 部分配置,內容如下:
server { listen 80; #server_name localhost; server_name localhost 192.168.56.9; charset utf-8; #charset koi8-r; #access_log logs/host.access.log main; #location / { # root html; # index index.html index.htm; #} location /{ include uwsgi_params; uwsgi_pass 127.0.0.1:8080; } location /static{ alias /var/www; access_log off; }
listen 監聽的是對外端口
server_name 標識的是對外提供服務的主機地址,此處是192.168.56.9
location / 根目錄是用來配置和uwsgi 通信,此處是本地同一臺主機,所以使用127.0.0.1用的是8080端口
include uwsgi_param 用來啟用通信的一些配置參數。uwsgi_param在目錄/usr/local/nginx/conf/ 下
location /static 用來配置靜態目錄,就是python3 manage collectstatic 收集的靜態文件目錄/var/www
2.2 nginx 啟用
nginx -c /usr/local/nginx/conf/nginx.conf
指定特定的配置文件啟動
(ll_env) [root@192 hourseWebSiteProject]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:10022 0.0.0.0:* LISTEN 999/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1641/nginx: master tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1628/uwsgi tcp6 0 0 :::10022 :::* LISTEN 999/sshd tcp6 0 0 :::3306 :::* LISTEN 1037/mysqld
netstat -ntlp 命令可以查看到nginx進程使用的80端口,本地通信uwsgi 使用socket 8080 端口
2.3 nginx 停止
nginx -s stop
</script>
*請認真填寫需求信息,我們會在24小時內與您取得聯系。