本文講述如何用nginx代理多個flask,從而進行負載均衡html
所需準備 :node
1. nginx 它的安裝能夠參考 http://www.cnblogs.com/skynet/p/4146083.html 2. flask sudo pip install Flask 3. uwsgi sudo pip install uwsgi 使用uwsgi的緣由是,若是光溜溜的flask是很容易崩潰的, 外面套一層uwsgi,實踐檢驗能讓flask強壯不少 若沒法安裝uwsgi這個庫,則大多數緣由是由於少了兩個東西 : ubuntu系列 : sudo apt-get install python-dev sudo apt-get install setuptools centos系列 : sudo yum install python-devel sudo yum install setuptools
下面舉個例子,講講具體的配置python
1. 個人用flask庫寫的web服務端程序的根目錄 : /home/seven/program/openmind_server/ 2. 在這個目錄下,個人程序的入口文件是 main.py 即入口文件的絕對地址是 /home/seven/program/openmind_server/main.py 且爲了使用方便,最好讓這個腳本接受兩個參數,分別做爲這個進程綁定的地址和端口 例如 : python main.py 127.0.0.1 8081 python main.py 127.0.0.1 8082 3. 在這個腳本中,個人app的名稱是 Server_App 即 main.py 中,有相似這樣的語句 : Server_App = flask.Flask(__name__) Server_App.secret_key = '\r\x9d1\xd1\xccW\x9e\xa6\x9a\x97[\xb1=\x93\x87\x15s<\xe8\xe3\x13DL?' # 注意,若你的flask程序在不一樣的機子上(通常生產環境下都是這樣,是真正的多機負載均衡) # 則,這個 secret_key 要保持一致,不然session可能沒法正常工做
[uwsgi] socket = 127.0.0.1:8081 綁定監聽的地址和端口 實際生產環境下 : 1. 建議nginx單獨一臺服務器,而後其餘的flask都在同一網段的其餘機子上 2. uwsgi要在 nginx結點,及每臺flask結點上 都要安裝 3. flask只要在每臺flask結點上安裝 4. 這個uwsgi配置文件和對應的flask程序是在同一臺機子上的 master = true pidfile = /mydata/openmind_server/pids/uwsgi8081.pid 這個uwsgi進程的pid文件的路徑(建議使用絕對路徑) chdir = /home/seven/program/openmind_server/ 你的用flask庫編寫的服務端程序的根目錄的路徑 (建議使用絕對路徑,且最後有'/') (若flask程序位於不一樣機子上,則要保證各機子上的路徑是一致的) wsgi-file = main.py 在上述目錄下,你的入口腳本的名字 callable = Server_App 在上述入口腳本中,你的flask的app對象的名字 processes = 2 該值建議與CPU核數相同 threads = 4 佔用的線程數 stats = 127.0.0.1:9091 查詢狀態信息的端口 logdate=true daemonize=/mydata/openmind_server/logs/flask8081.log 之後臺方式運行,且指定日誌文件的路徑(建議使用絕對路徑) ( uwsgi8082.ini, uwsgi8083.ini, uwsgi8084.ini 與之相似,改端口和路徑便可)
worker_processes 2; # 建議與CPU核數相同 error_log /mydata/nginx/log/error.log; # 錯誤日誌的路徑(建議使用絕對路徑) # 且除了它,在 /usr/local/nginx/logs/error.log 也有一部分的錯誤日誌 pid /mydata/nginx/pid/nginx.pid; # 進程號文件的路徑(建議使用絕對路徑) events { use epoll; # epoll效率比輪詢要高 multi_accept on; worker_connections 1024; # 最大鏈接數 } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; client_body_buffer_size 512k; client_max_body_size 32m; large_client_header_buffers 4 32k; access_log /mydata/nginx/log/access.log; # 訪問日誌路徑(建議使用絕對路徑) sendfile on; tcp_nodelay on; server_tokens off; access_log off; charset UTF-8; keepalive_timeout 60; open_file_cache max=1024 inactive=20s; open_file_cache_valid 60s; open_file_cache_min_uses 2; upstream my_servers { server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; server 127.0.0.1:8084; } # 轉發配置 : # 一共能夠轉發到本機的8081,8082,8083,8084四個結點上 # 實際生產環境中建議flask結點在其餘機子上 server { listen 80; # 對外暴露80端口 server_name localhost default backlog=256; access_log /mydata/nginx/log/host.access.log; location / { uwsgi_pass my_servers; include uwsgi_params; uwsgi_param UWSGI_CHDIR /home/seven/program/openmind_server/; uwsgi_param UWSGI_SCRIPT main; } # 轉發配置 : # 經過使用上面定義的 upstream my_servers 來進行負載均衡 # 且指定flask程序的根目錄 # 且指定flask程序根目錄下的入口腳本的名稱(不包含後綴名) # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
uwsgi --ini path/uwsgi8081.ini 啓動8081結點(以非root用戶的身份來啓動) uwsgi --ini path/uwsgi8082.ini 啓動8082結點(以非root用戶的身份來啓動) uwsgi --ini path/uwsgi8083.ini 啓動8083結點(以非root用戶的身份來啓動) uwsgi --ini path/uwsgi8084.ini 啓動8084結點(以非root用戶的身份來啓動) cd /usr/local/nginx/sbin 進入nginx的腳本目錄 ./nginx 啓動nginx(注意要以root用戶身份來啓動)
uwsgi --reload path/uwsgi8081.pid 重啓8081結點(指定對應的pid文件,以非root身份) uwsgi --reload path/uwsgi8082.pid 重啓8082結點(指定對應的pid文件,以非root身份) uwsgi --reload path/uwsgi8083.pid 重啓8083結點(指定對應的pid文件,以非root身份) uwsgi --reload path/uwsgi8084.pid 重啓8084結點(指定對應的pid文件,以非root身份) cd /usr/local/nginx/sbin 進入nginx的腳本目錄 ./nginx -s stop 關閉nginx(注意要以root用戶身份來關閉) ./nginx 再次啓動nginx(注意要以root用戶身份來啓動)