nginx代理多個flask

nginx 代理多個flask

本文講述如何用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

一. flask程序的信息

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配置文件 uwsgi8081.ini

[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 與之相似,改端口和路徑便可)

三. nginx配置文件 /usr/local/nginx/conf/nginx.conf

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用戶身份來啓動)
相關文章
相關標籤/搜索