Flask+uwsgi+Nginx的簡易搭建(ubuntu)

1. Virtualenv

這個其實不是必須的,但是每個項目都應該擁有專屬的依賴而不受其他項目的影響,建議還是用一下比較好,具體可以看這裏。需要注意的是,在ubuntu下的python2.7的執行文件是/usr/bin/python

  • 創建一個項目文件名爲myflask的文件夾,並在此目錄下創建名爲venv的虛擬環境,然後激活虛擬環境

    www@ubuntu:~/myflask$ source venv/bin/activate
    (venv) www@ubuntu:~/myflask$ 
  • 在虛擬環境中安裝flask

    (venv) www@ubuntu:~/myflask$ pip install flask

2. 編寫Flask的demo

  • 在虛擬環境中編寫flask的demo,命名爲main.py

    
    # main.py
    
    from flask import Flask
    app = Flask(__name__)
    app.debug = True
    
    @app.route('/')
    def index():
        return "<h1 style='color:red'>hello world!</h1>"
    
    if __name__ == '__manin__':
        app.run(host='0.0.0.0')
        # app.run()    # 表示默認使用localhost:5000,這樣是在公網訪問不到的
  • 測試運行demo:python main.py,此時在瀏覽器中訪問ip:5000即可看到頁面

3. uwsgi

  • 在虛擬環境中安裝uwsgi

    (venv) www@ubuntu:~/myflask$ pip install uwsgi

    注意:這裏需要先安裝兩個依賴,我已經提前裝好了,不再重複。安裝指令:apt-get install build-essential python-dev

  • 編寫uwsgi的配置文件,命名爲config.ini

    (venv) www@ubuntu:~/myflask$ vi config.ini
    
    [uwsgi]
    master = true
    wsgi-file = main.py
    callable = app
    http = :8001
    processes = 4
    threads = 2
    buffer-size = 32768

    注意:http = :8001只是爲了該階段測試用,後面如果使用到nginx代理,則需要改爲socket = 127.0.0.1:8001。另外callable = app中的app要和flask的demo中的application變量名一致。

  • 測試:應用config.ini啓動uwsgi

    (venv) www@ubuntu:~/myflask$ uwsgi config.ini
    
    ...(省略日誌)
    *** Operational MODE: preforking+threaded ***
    WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7934d0 pid: 30968 (default app)
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI master process (pid: 30968)
    spawned uWSGI worker 1 (pid: 30971, cores: 2)
    spawned uWSGI worker 2 (pid: 30972, cores: 2)
    spawned uWSGI worker 3 (pid: 30973, cores: 2)
    spawned uWSGI worker 4 (pid: 30974, cores: 2)

    看到這樣,基本是成功了,此時在瀏覽器中輸入ip:8001即可看到頁面。

4. Nginx

上面已經介紹到使用uwsgi接管flask應用,現在我們需要使用nginx來代理,因此我們需要對uwsgi的配置做一些小修改,先crtl+C關閉uwsgi服務。

  • 修改config.ini

    (venv) www@ubuntu:~/myflask$ vi config.ini
    
    [uwsgi]
    master = true
    wsgi-file = main.py
    callable = app
    socket = 127.0.0.1:8001
    processes = 4
    threads = 2
    buffer-size = 32768

    這樣,運行起來的uwsgi服務只能通過本地內部的8001端口來訪問,而不能像上面介紹的在瀏覽器使用http來訪問了。因爲我們需要nginx來做http代理,也就是說,我們需要nginx接收到的符合要求的http請求都轉發到本地的8001端口的uwsgi服務,以便讓uwsgi服務做後續處理。

  • 安裝nginx

    root@ubuntu:~# apt-get install nginx
  • 啓動nginx

    root@ubuntu:~# /etc/init.d/nginx start

    在瀏覽器輸入ip:80ip即可訪問到nginx的默認頁面:

    welcome nginx

  • 修改nginx的配置文件/etc/nginx/sites-available/default

    root@ubuntu:~# vi /etc/nginx/sites-available/default
    
    ...
    server {
            # listen 80 default_server;
            # listen [::]:80 default_server ipv6only=on;
            listen 80;  # 監聽端口,http默認80
    
            # root /usr/share/nginx/html;
            root /home/www/myflask;      # flask項目根路徑
            # index index.html index.htm;
    
            # Make site accessible from http://localhost/
            # server_name localhost;
            server_name XX.XX.XX.XX;    # 公網ip或已解析ip的域名
    
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
                    # try_files $uri $uri/ =404;
                    # Uncomment to enable naxsi on this location
                    # include /etc/nginx/naxsi.rules
    
                    include uwsgi_params;   # 使用nginx內置的uwsgi配置參數文件
                    uwsgi_pass 127.0.0.1:8001;   # 轉發請求到該地址端口
                    uwsgi_param UWSGI_SCRIPT main:app;   # 調用的腳本名稱和application變量名
            }
    
            ...
    }

    稍微解釋一下location的意思:我理解爲當接收到http請求時,看http請求中的鏈接內容是什麼,根據location後面的參數進行匹配,/的意思是全部,也就是說所有http請求都轉發到127.0.0.1:8001這個內部端口。

  • 檢查nginx配置文件是否有錯誤:root@ubuntu:~# nginx -t

  • 重啓nginx服務:root@ubuntu:~# service nginx restart
  • 重新啓動uwsgi服務:(venv) www@ubuntu:~/myflask$ uwsgi config.ini

  • 此時,在瀏覽器輸入ip:80ip即可訪問到flask頁面:

flask+nginx

5. supervisor

上面的方法最後是要使用命令執行uwsgi服務,並要一直運行它纔可以訪問到的,只要該服務崩潰了或關閉了就訪問不到了。所以有小夥伴會使用到supervisor來做uwsgi的引導。

  • 安裝supervisor

    root@ubuntu:~# apt-get install supervisor
  • 新增配置文件

    root@ubuntu:~# vi /etc/supervisor/conf.d/myflask_supervisor.conf
    
    [program:myflask]
    
    # 啓動命令入口
    
    command = /home/www/myflask/venv/bin/uwsgi /home/www/myflask/config.ini
    
    
    # 命令程序所在目錄
    
    directory = /home/www/myflask
    
    # 運行命令的用戶名,親測www不行
    
    user = root
    
    autostart = true
    autorestart = true
    
    
    #日誌地址
    
    stdout_logfile = /home/www/myflask/log/uwsgi_supervisor.log 

    supervisor的全局配置配置文件:/etc/supervisor/supervisor.conf,一般不改

  • 啓動supervisor服務:service supervisor start

  • 關閉supervisor服務:service supervisor stop
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章