nginx+django+gunicorn+gevent+supervisor

安裝環境介紹:

    python2.7.10
    django1.7.9

    linux CentOS release 6.5 (Final) 64


    假設我的項目位置爲/var/www/myweb
    服務器IP爲192.168.0.100

1、插件安裝

    gunicorn-19.7.1   uwsgi組件
    gevent-1.2.1    異步組件
    greenlet-0.4.12  異步組件
    supervisor-3.3.0 進程管理組件

    直接下載然後運行 對應的 python setup.py install    

2、myweb wsgi 配置 

    位置: /var/www/myweb/wsgi.py
    import sys
    import os
    p = os.path.abspath(os.path.dirname(__file__))
    sys.path.insert(0, os.path.split(p)[0])
    os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()

3、運行 gunicorn

    cd /var/www/myweb  
    /usr/local/python/bin/gunicorn -w 4 -k gevent -m 0002 -b 0.0.0.0:8000 --limit-request-field_size 0 --limit-request-line 0 --error-logfile /var/log/gunicorn/myweb_gunicorn_error.log wsgi:application 
    
    -w 啓動多少個工作進程,可以根據CPU的個數開啓,一個CPU開一個
    -k 工作進程類
    -m umask權限
    -b 地址端口配置
    wsgi:application wsgi實例
    
    對於直接運用gunicorn不通過supervisor的話,可以守護的方式啓動,加入參數 -D
    /usr/local/python/bin/gunicorn -w 4 -k gevent -m 0002 -b 0.0.0.0:8000 --limit-request-field_size 0 --limit-request-line 0 --error-logfile /var/log/gunicorn/myweb_gunicorn_error.log -D wsgi:application

    

可以把配置參數寫到文件中,這樣比較好看一點

例如創建文件test.gun :

import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
workers = 9
worker_connections = 2048
backlog = 2048
worker_class = "gevent"
keepalive = 15
umask = '002'
daemon = False
bind = '0.0.0.0:8000'
timeout = 60
pidfile = '/var/run/gunicorn/app.pid'
accesslog = '/var/log/gunicorn/app-access_log'
errorlog = '/var/log/gunicorn/app-error_log'

limit_request_line = 0
limit_request_fields = 32768
limit_request_field_size = 0

然後配置命令如下:

command=/usr/local/python/bin/gunicorn -c  /etc/supervisor/conf.d/test.gun wsgi:application

    可以通過 gunicorn -h 查看更多配置參數

    運行遇到的問題:
         CRITICAL] WORKER TIMEOUT 超時問題
        有些應用執行時間過長,gunicorn默認給工作進程30秒處理時間,超過這個時間沒返回,
        爲了避免這種請求佔用資源,主進程會發送一個異常錯誤給客戶端,然後關掉重啓進程
        如果是業務本來就有這種可能,可以通過 -t 120 來設置超時時間,如果是有問題的,
        則可以通過 --log-level debug 來啓動,查找日誌是哪個URL出現這麼耗時,進行優化

       當然設置這個時間多長都是一個問題,所以最要去做的是,檢查所有代碼,看是否有些地方有超長延時情況,

       把這種延時情況主動拒絕掉,比如有些對外的請求,或者api調用,可能超時,可以設置超時請求,

        http設置超時請求:

         import socket
         socket.setdefaulttimeout(15)

        可能還有很多情況,處理時間比較長,對於這種情況,建議通過任務隊列的方式處理,

        如果要實時等待結果,那也是不能這麼長的等待的,除非一些內部的系統,對併發沒有要求,可以設置超時時間長一點。

        
        /usr/local/python/bin/gunicorn -w 4 -k gevent -m 0002 -b 0.0.0.0:8000 --limit-request-field_size 0 --limit-request-line 0 --log-level debug --error-logfile /var/log/gunicorn/myweb_gunicorn_error.log -D wsgi:application
 

    
    確保8000端口,防火牆已經開啓
    通過 http://192.168.0.100:8000 訪問

4、nginx的安裝與配置

    爲了提高網站的效率,對於靜態文件通過nginx發送,
    其他應用URL轉發到gunicorn啓動的進程
    
    安裝:
      ./configure
       make
       make install
    
    配置:
        server {
              listen       8080;
              location / {
                 proxy_connect_timeout 600;
                 proxy_send_timeout 600;
                 proxy_read_timeout 600;
                 server_name_in_redirect off;
                 proxy_set_header Host $host:$server_port;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header REMOTE-HOST $remote_addr;
                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 client_max_body_size    300m;
                 proxy_pass http://127.0.0.1:8000;
             }
        
             location /media/ {
                  alias /var/www/myweb/static/;
             }
             location /static/ {
                  alias /var/www/myweb/static/;
             }

         }

    sudo /usr/local/nginx/sbin/nginx -s reload

    確保8080端口,防火牆已經開啓
    通過 http://192.168.0.100:8080 訪問
        
 

5、 supervisor 方式部署gunicorn

    守護方式運行,也爲了後續維護,
    比如修改參數,啓動,停止等,supervisor都非常方便
    
    /etc/supervisor/conf.d 下新增 gunicorn.conf
    
    [program:myweb_gunicorn]
    directory=/var/www/myweb
    command=/usr/local/python/bin/gunicorn -w 4 -k gevent -m 0002 -b 0.0.0.0:8000 --limit-request-field_size 0 --limit-request-line 0 --error-logfile /var/log/gunicorn/myweb_gunicorn_error.log  wsgi:application
    autostart = true
    startsecs = 5
    user=myuser
    redirect_stderr = true
    stdout_logfile_maxbytes = 20MB
    stdout_logfile_backups = 20
    stdout_logfile =/var/log/gunicorn/myweb_gunicorn.log
    
    特備註意,改了gunicorn.conf一定要重新加載配置,否則重啓不生效
    /usr/local/python/bin/supervisorctl reload myweb_gunicorn
    
    #重啓服務
    /usr/local/python/bin/supervisorctl restart myweb_gunicorn

6、linux配置其他用戶sudo權限啓動

    vim /etc/sudoers
    myuser ALL=(ALL)       NOPASSWD: /usr/local/nginx/sbin/nginx

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