nginx, supervisor, celery

 

資料:

supervisor和nginx使用


1 、supervisor  管理進程工具
2 、nginx  反向代理, 負載均衡


安裝nginx
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)


安裝成功後請求服務器返回
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.



安裝supervisor
$pip install supervisor
$ supervisord -v
3.3.3


1、nginx操做
nx/sites
nginx文件配置 /etc/nginx/conf.d目錄下建立配置文件tornado_003.conf  而後將建立的配置文件加載到conf.d同目錄下的nginx.conf文件的
‘Virtualenv Host Config’處, include /etc/nginx/conf.d/*.conf; #include /etc/nginx/sites-enabled/*; # 設置n個服務器,也叫集羣 upstream tornadoes { server
127.0.0.1:9000; server 127.0.0.1:9001; } server { listen 10000 default_server; server_name localhost;      # 訪問靜態文件從該目錄獲取 location /static/ { alias /home/ubuntu/work/tornado_test_003/static/; }      # websocket模塊,須要指定 1.1版本 該路由爲websocket創建鏈接的路由 location /ws { proxy_http_version 1.1; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://tornadoes; }      # 其餘全部url location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://tornadoes; } } 檢查語法 $ sudo service nginx configtest 從新加載配置文件並重啓nginx $ sudo service nginx reload 重啓nginx $ sudo service nginx restart 啓動 $ sudo service nginx start 中止 $ sudo service nginx stop 查看nginx進程 $ ps aux | grep nginx 查看配置文件 $ vim /etc/nginx/nginx.conf 配置文件目錄說明 sites-available 目錄下放配置文件 sites-enabled 目錄下放軟鏈接文件,連接到sites-available目錄中要使用的配置 點擊:更多nginx參數說明 2、supervisor操做 --點擊 supervisor參數說明
項目目錄建立supervisord.conf文件寫入配置 [group:tornadoes] programs
=tornado-9000,tornado-9001 [program:tornado-9000] command=python server.py -runserver -port=9000 directory=/home/ubuntu/work/tornado_test_003 use=ubuntu autorestart=true redirect_stderr=true stdout_logfile=/home/ubuntu/work/tornado_test_003/tornado003.log loglevel=info [program:tornado-9001] command=python server.py -runserver -port=9001 directory=/home/ubuntu/work/tornado_test_003 use=pyvip autorestart=true redirect_stderr=true stdout_logfile=/home/ubuntu/work/tornado_test_003/tornado003.log loglevel=info [supervisord] [supervisorctl] serverurl=http://192.168.10.128:9999 username=superadmin password=222 [inet_http_server] port=:9999 username=superadmin password=222 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 啓動supervisor supervisord -c supervisord.conf 啓動客戶端 supervisorctl -c supervisord.conf 客戶端內操做進程 > status # 查看程序狀態 > stop tornadoes:tornado-8000 # 關閉 程序 > start tornadoes:tornado-8000 # 啓動 程序 > restart tornadoes:tornado-8000 # 重啓 程序 > reread # 讀取有更新(增長)的配置文件,不會啓動新添加的程序 > update # 重啓配置文件修改過的程序 控制檯操做進程 $ supervisorctl status $ supervisorctl stop tornadoes:tornado-8000 $ supervisorctl start tornadoes:tornado-8000 $ supervisorctl restart tornadoes:tornado-8000 $ supervisorctl reread $ supervisorctl update 操做步驟 (friend_server_test1) rock1@rock1:~/work/tornado_test/friends_server$ supervisorctl -c supervisord.conf tornadoes:tornado-8000 RUNNING pid 2534, uptime 0:00:19 tornadoes:tornado-8001 RUNNING pid 2535, uptime 0:00:19 supervisor> status tornadoes:tornado-8000 RUNNING pid 2534, uptime 0:02:39 tornadoes:tornado-8001 RUNNING pid 2535, uptime 0:02:39 supervisor> stop tornadoes:tornado-8000 tornadoes:tornado-8000: stopped supervisor> status tornadoes:tornado-8000 STOPPED Jul 24 04:28 AM tornadoes:tornado-8001 RUNNING pid 2535, uptime 0:03:04 supervisor> start tornadoes:tornado-8000 tornadoes:tornado-8000: started supervisor> status tornadoes:tornado-8000 RUNNING pid 2553, uptime 0:00:07 tornadoes:tornado-8001 RUNNING pid 2535, uptime 0:03:47 supervisor> restart tornadoes:tornado-8000 tornadoes:tornado-8000: stopped tornadoes:tornado-8000: started supervisor> reread tornadoes: changed supervisor> update tornadoes: stopped tornadoes: updated process group supervisor> 4、資料 nginx.conf文件默認內容 #啓動進程的用戶名 user www-data; #開啓的工做進程數量,常設置成和cpu的數量相等 worker_processes auto; #進程的PID存放的位置 pid /run/nginx.pid; #工做模式及鏈接數上限 events { #單個後臺worker process進程的最大併發連接數 worker_connections 768; # multi_accept on; } #設定http服務器,利用它的反向代理功能提供負載均衡支持 http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## #記錄客戶端連接 access_log /var/log/nginx/access.log; #記錄錯誤日誌 error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } #mail { # # See sample authentication script at: # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript # # # auth_http localhost/auth.php; # # pop3_capabilities "TOP" "USER"; # # imap_capabilities "IMAP4rev1" "UIDPLUS"; # # server { # listen localhost:110; # protocol pop3; # proxy on; # } # # server { # listen localhost:143; # protocol imap; # proxy on; # } #} sites-enabled/default文件內容 ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # http://wiki.nginx.org/Pitfalls # http://wiki.nginx.org/QuickStart # http://wiki.nginx.org/Configuration # # Generally, you will want to move this file somewhere, and start with a clean # file but keep this around for reference. Or just disable in sites-enabled. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## # Default server configuration # server { #nginx監聽主機和端口,default_server是當前server塊是默認主機 listen 80 default_server; listen [::]:80 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debian.org/773332 # # Read up on ssl_ciphers to ensure a secure configuration. # See: https://bugs.debian.org/765782 # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; #主機名,在收到http請求後,獲取請求頭中的HOST,與每一個server中的server_name匹配 server_name _; #本地塊在server塊內部,經過server_name找到一臺主機,location劃分路徑 #~ 大小寫敏感 #~*忽略大小寫 #^~ 只需匹配前面的部分 #@用於處理nginx內部的請求之間重定向,不直接處理請求 #/匹配全部路徑 #以root設置資源路徑, #location /aaa/ { # root /tmp/a/; #} #用戶請求"/aaa/page"至關於 "/tmp/a/aaa/page" #以別名方式設置資源路徑alias #location /aaa/ { alias /tmp/a/; #} #用戶請求"/aaa/page"至關於 "/tmp/a/page" #配置首頁 #location / { # root path; # index /index.html /index.php #} #返回碼頁面重定向 #location / { error_page 404 @aaa #location @aaa { # proxy_pass http://abc; #反向代理到其它服務器上 #} location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php7.0-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php7.0-fpm: # fastcgi_pass unix:/run/php/php7.0-fpm.sock; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # Virtual Host configuration for example.com # # You can move that to a different file under sites-available/ and symlink that # to sites-enabled/ to enable it. # #server { # listen 80; # listen [::]:80; # # server_name example.com; # # root /var/www/example.com; # index index.html; # # location / { # try_files $uri $uri/ =404; # } #} supervisor配置詳解 http://lixcto.blog.51cto.com/4834175/1539136 有陣子沒寫博客了,這段時間一直在研究python django框架和前端相關的東西。樓主學通訊的,對web這一塊啥也不懂,學了一個禮拜django,接着學了2個禮拜前端,感受仍是作不出來一個好看的頁面。週末去了趟上海,蹭大神的講課,學會了套用bootstrap框架和heighcharts,頁面上也終於出來能看的東西了,也算是在web開發方面邁出了階段性的一步。 這兩天公司終於派任務給我作了,不容易了啊,來了五個月了,終於有活幹了。雖然只給了內測遊戲服務器上的權限,不過也夠樓主搗騰一段時間了。 這兩天干的活,是讓樓主寫一個supervisor的listener,用來監控supervisor所管理子進程的狀態,當子進程異常退出時,樓主寫的這個listener將會觸發報警。在這裏總結下supervisor的知識吧 先說說supervisor是幹什麼的吧? supervisor這東西,其實就是用來管理進程的。我們爲何要用supervisor呢?由於,相對於咱們linux傳統的進程管理方式來講,它有不少的優點,要否則我們也不會閒着沒事去用supervisor了。 OK,下面來看看supervisor有哪些好處吧。 簡單 爲啥簡單呢?由於我們一般管理linux進程的時候,通常來講都須要本身編寫一個可以實現進程start/stop/restart/reload功能的腳本,而後丟到/etc/init.d/下面。這麼作有不少很差的地方,第一咱們要編寫這個腳本,這就很耗時耗力了。第二,當這個進程掛掉的時候,linux不會自動重啓它的,想要自動重啓的話,咱們還要本身寫一個監控重啓腳本。而,supervisor則能夠完美的解決這些問題。好,怎麼解決的呢,其實supervisor管理進程,就是經過fork/exec的方式把這些被管理的進程,看成supervisor的子進程來啓動。這樣的話,咱們只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去就OK了。這樣就省下了咱們如同linux管理進程的時候,本身寫控制腳本的麻煩了。第二,被管理進程做爲supervisor的子進程,當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,因此固然也就能夠對掛掉的子進程進行自動重啓了,固然重啓仍是不重啓,也要看你的配置文件裏面有木有設置autostart=true了,這是後話。 精確 爲啥說精確呢?由於linux對進程狀態的反饋,有時候不太準確。爲啥不許確?這個樓主也不知道啊,官方文檔是這麼說的,知道的告訴樓主一下吧,感激涕零。而supervisor監控子進程,獲得的子進程狀態無疑是準確的。 進程組 supervisor能夠對進程組統一管理,也就是說我們能夠把須要管理的進程寫到一個組裏面,而後咱們把這個組做爲一個對象進行管理,如啓動,中止,重啓等等操做。而linux系統則是沒有這種功能的,咱們想要中止一個進程,只能一個一個的去中止,要麼就本身寫個腳本去批量中止。 集中式管理 supervisor管理的進程,進程組信息,所有都寫在一個ini格式的文件裏就OK了。並且,咱們管理supervisor的時候的能夠在本地進行管理,也能夠遠程管理,並且supervisor提供了一個web界面,咱們能夠在web界面上監控,管理進程。 固然了,本地,遠程和web管理的時候,須要調用supervisor的xml_rpc接口,這個也是後話。 有效性 當supervisor的子進程掛掉的時候,操做系統會直接給supervisor發信號。而其餘的一些相似supervisor的工具,則是經過進程的pid文件,來發送信號的,而後按期輪詢來重啓失敗的進程。顯然supervisor更加高效。。。至因而哪些相似supervisor工具,這個樓主就不太清楚了,樓主還據說過god,director,可是沒用過。有興趣的朋友能夠玩玩 可擴展性 supervisor是個開源軟件,牛逼點的,能夠直接去改軟件。不過我們大多數人仍是老老實實研究supervisot提供的接口吧,supervisor主要提供了兩個可擴展的功能。一個是event機制,這個就是樓主這兩天干的活要用到的東西。再一個是xml_rpc,supervisor的web管理端和遠程調用的時候,就要用到它了。 權限 大夥都知道linux的進程,特別是偵聽在1024端口之下的進程,通常用戶大多數狀況下,是不能對其進行控制的。想要控制的話,必需要有root權限。而supervisor提供了一個功能,能夠爲supervisord或者每一個子進程,設置一個非root的user,這個user就能夠管理它對應的進程了。 不過這功能,用不用就看大夥本身的環境了 還有一些什麼兼容性,穩定性,感受用處不大,就不扯了。 安裝 安裝方法很簡單。樓主的系統是debian,其它系統就不說了 pip install supervisor 生成配置文件 安裝好supervisor以後,默認是沒有生成配置文件的。能夠經過如下命令生成配置文件 echo_supervisord_conf > /etc/supervisord.conf 咱們一般是把配置文件放到/etc/下面,固然也能夠放到任意路徑下面。 啓動 如下啓動順序由上到下優先級,依次遞減 supervisord #默認去找$CWD/supervisord.conf,也就是當前目錄 supervisord #默認$CWD/etc/supervisord.conf,也就當前目錄下的etc目錄 supervisord #默認去找/etc/supervisord.conf的配置文件 supervisord -c supervisord.conf #到指定路徑下去找配置文件 supervisor組件 supervisord supervisord是supervisor的服務端程序。 乾的活:啓動supervisor程序自身,啓動supervisor管理的子進程,響應來自clients的請求,重啓閃退或異常退出的子進程,把子進程的stderr或stdout記錄到日誌文件中,生成和處理Event supervisorctl 這東西仍是有點用的,若是說supervisord是supervisor的服務端程序,那麼supervisorctl就是client端程序了。supervisorctl有一個類型shell的命令行界面,咱們能夠利用它來查看子進程狀態,啓動/中止/重啓子進程,獲取running子進程的列表等等。。。最牛逼的一點是,supervisorctl不只能夠鏈接到本機上的supervisord,還能夠鏈接到遠程的supervisord,固然在本機上面是經過UNIX socket鏈接的,遠程是經過TCP socket鏈接的。supervisorctl和supervisord之間的通訊,是經過xml_rpc完成的。 相應的配置在[supervisorctl]塊裏面 Web Server Web Server主要能夠在界面上管理進程,Web Server實際上是經過XML_RPC來實現的,能夠向supervisor請求數據,也能夠控制supervisor及子進程。配置在[inet_http_server]塊裏面 XML_RPC接口 這個就是遠程調用的,上面的supervisorctl和Web Server就是它弄的 配置文件詳解 [unix_http_server] file=/tmp/supervisor.sock ; socket文件的路徑,supervisorctl用XML_RPC和supervisord通訊就是經過它進行 的。若是不設置的話,supervisorctl也就不能用了 不設置的話,默認爲none。 非必須設置 chmod=0700 ; 這個簡單,就是修改上面的那個socket文件的權限爲0700 不設置的話,默認爲0700。 非必須設置 chown=nobody:nogroup ; 這個同樣,修改上面的那個socket文件的屬組爲user.group 不設置的話,默認爲啓動supervisord進程的用戶及屬組。非必須設置 username=user ; 使用supervisorctl鏈接的時候,認證的用戶 不設置的話,默認爲不須要用戶。 非必須設置 password=123 ; 和上面的用戶名對應的密碼,能夠直接使用明碼,也可使用SHA加密 如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d 默認不設置。。。非必須設置 [inet_http_server] ; 偵聽在TCP上的socket,Web Server和遠程的supervisorctl都要用到他 不設置的話,默認爲不開啓。非必須設置 port=127.0.0.1:9001 ; 這個是偵聽的IP和端口,偵聽全部IP用 :9001或*:9001。 這個必須設置,只要上面的[inet_http_server]開啓了,就必須設置它 username=user ; 這個和上面的uinx_http_server一個樣。非必須設置 password=123 ; 這個也一個樣。非必須設置 [supervisord] ;這個主要是定義supervisord這個服務端進程的一些參數的 這個必須設置,不設置,supervisor就不用幹活了 logfile=/tmp/supervisord.log ; 這個是supervisord這個主進程的日誌路徑,注意和子進程的日誌不搭嘎。 默認路徑$CWD/supervisord.log,$CWD是當前目錄。。非必須設置 logfile_maxbytes=50MB ; 這個是上面那個日誌文件的最大的大小,當超過50M的時候,會生成一個新的日 志文件。當設置爲0時,表示不限制文件大小 默認值是50M,非必須設置。 logfile_backups=10 ; 日誌文件保持的數量,上面的日誌文件大於50M時,就會生成一個新文件。文件 數量大於10時,最初的老文件被新文件覆蓋,文件數量將保持爲10 當設置爲0時,表示不限制文件的數量。 默認狀況下爲10。。。非必須設置 loglevel=info ; 日誌級別,有critical, error, warn, info, debug, trace, or blather等 默認爲info。。。非必須設置項 pidfile=/tmp/supervisord.pid ; supervisord的pid文件路徑。 默認爲$CWD/supervisord.pid。。。非必須設置 nodaemon=false ; 若是是true,supervisord進程將在前臺運行 默認爲false,也就是後臺以守護進程運行。。。非必須設置 minfds=1024 ; 這個是最少系統空閒的文件描述符,低於這個值supervisor將不會啓動。 系統的文件描述符在這裏設置cat /proc/sys/fs/file-max 默認狀況下爲1024。。。非必須設置 minprocs=200 ; 最小可用的進程描述符,低於這個值supervisor也將不會正常啓動。 ulimit -u這個命令,能夠查看linux下面用戶的最大進程數 默認爲200。。。非必須設置 umask=022 ; 進程建立文件的掩碼 默認爲022。。非必須設置項 user=chrism ; 這個參數能夠設置一個非root用戶,當咱們以root用戶啓動supervisord以後。 我這裏面設置的這個用戶,也能夠對supervisord進行管理 默認狀況是不設置。。。非必須設置項 identifier=supervisor ; 這個參數是supervisord的標識符,主要是給XML_RPC用的。當你有多個 supervisor的時候,並且想調用XML_RPC統一管理,就須要爲每一個 supervisor設置不一樣的標識符了 默認是supervisord。。。非必需設置 directory=/tmp ; 這個參數是當supervisord做爲守護進程運行的時候,設置這個參數的話,啓動 supervisord進程以前,會先切換到這個目錄 默認不設置。。。非必須設置 nocleanup=true ; 這個參數當爲false的時候,會在supervisord進程啓動的時候,把之前子進程 產生的日誌文件(路徑爲AUTO的狀況下)清除掉。有時候我們想要看歷史日誌,當 然不想日誌被清除了。因此能夠設置爲true 默認是false,有調試需求的同窗能夠設置爲true。。。非必須設置 childlogdir=/tmp ; 當子進程日誌路徑爲AUTO的時候,子進程日誌文件的存放路徑。 默認路徑是這個東西,執行下面的這個命令看看就OK了,處理的東西就默認路徑 python -c "import tempfile;print tempfile.gettempdir()" 非必須設置 environment=KEY="value" ; 這個是用來設置環境變量的,supervisord在linux中啓動默認繼承了linux的 環境變量,在這裏能夠設置supervisord進程特有的其餘環境變量。 supervisord啓動子進程時,子進程會拷貝父進程的內存空間內容。 因此設置的 這些環境變量也會被子進程繼承。 小例子:environment=name="haha",age="hehe" 默認爲不設置。。。非必須設置 strip_ansi=false ; 這個選項若是設置爲true,會清除子進程日誌中的全部ANSI 序列。什麼是ANSI 序列呢?就是咱們的\n,\t這些東西。 默認爲false。。。非必須設置 the below section must remain in the config file for RPC (supervisorctl/web interface) to work, additional interfaces may be added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] ;這個選項是給XML_RPC用的,固然你若是想使用supervisord或者web server 這 個選項必需要開啓的 supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] ;這個主要是針對supervisorctl的一些配置 serverurl=unix:///tmp/supervisor.sock ; 這個是supervisorctl本地鏈接supervisord的時候,本地UNIX socket 路徑,注意這個是和前面的[unix_http_server]對應的 默認值就是unix:///tmp/supervisor.sock。。非必須設置 serverurl=http://127.0.0.1:9001 ; 這個是supervisorctl遠程鏈接supervisord的時候,用到的TCP socket路徑 注意這個和前面的[inet_http_server]對應 默認就是http://127.0.0.1:9001。。。非必須項 username=chris ; 用戶名 默認空。。非必須設置 password=123 ; 密碼 默認空。。非必須設置 prompt=mysupervisor ; 輸入用戶名密碼時候的提示符 默認supervisor。。非必須設置 history_file=~/.sc_history ; 這個參數和shell中的history相似,咱們能夠用上下鍵來查找前面執行過的命令 默認是no file的。。因此咱們想要有這種功能,必須指定一個文件。。。非 必須設置 The below sample program section shows all possible program subsection values, create one or more 'real' program: sections to be able to control them under supervisor. [program:theprogramname] ;這個就是我們要管理的子進程了,":"後面的是名字,最好別亂寫和實際進程 有點關聯最好。這樣的program咱們能夠設置一個或多個,一個program就是 要被管理的一個進程 command=/bin/cat ; 這個就是咱們的要啓動進程的命令路徑了,能夠帶參數 例子:/home/test.py -a 'hehe' 有一點須要注意的是,咱們的command只能是那種在終端運行的進程,不能是 守護進程。這個想一想也知道了,好比說command=service httpd start。 httpd這個進程被linux的service管理了,咱們的supervisor再去啓動這個命令 這已經不是嚴格意義的子進程了。 這個是個必須設置的項 process_name=%(program_name)s ; 這個是進程名,若是咱們下面的numprocs參數爲1的話,就不用管這個參數 了,它默認值%(program_name)s也就是上面的那個program冒號後面的名字, 可是若是numprocs爲多個的話,那就不能這麼幹了。想一想也知道,不可能每一個 進程都用同一個進程名吧。 numprocs=1 ; 啓動進程的數目。當不爲1時,就是進程池的概念,注意process_name的設置 默認爲1 。。非必須設置 directory=/tmp ; 進程運行前,會前切換到這個目錄 默認不設置。。。非必須設置 umask=022 ; 進程掩碼,默認none,非必須 priority=999 ; 子進程啓動關閉優先級,優先級低的,最早啓動,關閉的時候最後關閉 默認值爲999 。。非必須設置 autostart=true ; 若是是true的話,子進程將在supervisord啓動後被自動啓動 默認就是true 。。非必須設置 autorestart=unexpected ; 這個是設置子進程掛掉後自動重啓的狀況,有三個選項,false,unexpected 和true。若是爲false的時候,不管什麼狀況下,都不會被從新啓動, 若是爲unexpected,只有當進程的退出碼不在下面的exitcodes裏面定義的退 出碼的時候,纔會被自動重啓。當爲true的時候,只要子進程掛掉,將會被無 條件的重啓 startsecs=1 ; 這個選項是子進程啓動多少秒以後,此時狀態若是是running,則咱們認爲啓 動成功了 默認值爲1 。。非必須設置 startretries=3 ; 當進程啓動失敗後,最大嘗試啓動的次數。。當超過3次後,supervisor將把 此進程的狀態置爲FAIL 默認值爲3 。。非必須設置 exitcodes=0,2 ; 注意和上面的的autorestart=unexpected對應。。exitcodes裏面的定義的 退出碼是expected的。 stopsignal=QUIT ; 進程中止信號,能夠爲TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信號 默認爲TERM 。。當用設定的信號去幹掉進程,退出碼會被認爲是expected 非必須設置 stopwaitsecs=10 ; 這個是當咱們向子進程發送stopsignal信號後,到系統返回信息 給supervisord,所等待的最大時間。 超過這個時間,supervisord會向該 子進程發送一個強制kill的信號。 默認爲10秒。。非必須設置 stopasgroup=false ; 這個東西主要用於,supervisord管理的子進程,這個子進程自己還有 子進程。那麼咱們若是僅僅幹掉supervisord的子進程的話,子進程的子進程 有可能會變成孤兒進程。因此我們能夠設置可個選項,把整個該子進程的 整個進程組都幹掉。 設置爲true的話,通常killasgroup也會被設置爲true。 須要注意的是,該選項發送的是stop信號 默認爲false。。非必須設置。。 killasgroup=false ; 這個和上面的stopasgroup相似,不過發送的是kill信號 user=chrism ; 若是supervisord是root啓動,咱們在這裏設置這個非root用戶,能夠用來 管理該program 默認不設置。。。非必須設置項 redirect_stderr=true ; 若是爲true,則stderr的日誌會被寫入stdout日誌文件中 默認爲false,非必須設置 stdout_logfile=/a/path ; 子進程的stdout的日誌路徑,能夠指定路徑,AUTO,none等三個選項。 設置爲none的話,將沒有日誌產生。設置爲AUTO的話,將隨機找一個地方 生成日誌文件,並且當supervisord從新啓動的時候,之前的日誌文件會被 清空。當 redirect_stderr=true的時候,sterr也會寫進這個日誌文件 stdout_logfile_maxbytes=1MB ; 日誌文件最大大小,和[supervisord]中定義的同樣。默認爲50 stdout_logfile_backups=10 ; 和[supervisord]定義的同樣。默認10 stdout_capture_maxbytes=1MB ; 這個東西是設定capture管道的大小,當值不爲0的時候,子進程能夠從stdout 發送信息,而supervisor能夠根據信息,發送相應的event。 默認爲0,爲0的時候表達關閉管道。。。非必須項 stdout_events_enabled=false ; 當設置爲ture的時候,當子進程由stdout向文件描述符中寫日誌的時候,將 觸發supervisord發送PROCESS_LOG_STDOUT類型的event 默認爲false。。。非必須設置 stderr_logfile=/a/path ; 這個東西是設置stderr寫的日誌路徑,當redirect_stderr=true。這個就不用 設置了,設置了也是白搭。由於它會被寫入stdout_logfile的同一個文件中 默認爲AUTO,也就是隨便找個地存,supervisord重啓被清空。。非必須設置 stderr_logfile_maxbytes=1MB ; 這個出現好幾回了,就不重複了 stderr_logfile_backups=10 ; 這個也是 stderr_capture_maxbytes=1MB ; 這個同樣,和stdout_capture同樣。 默認爲0,關閉狀態 stderr_events_enabled=false ; 這個也是同樣,默認爲false environment=A="1",B="2" ; 這個是該子進程的環境變量,和別的子進程是不共享的 serverurl=AUTO ; The below sample eventlistener section shows all possible eventlistener subsection values, create one or more 'real' eventlistener: sections to be able to handle event notifications sent by supervisor. [eventlistener:theeventlistenername] ;這個東西其實和program的地位是同樣的,也是suopervisor啓動的子進 程,不過它乾的活是訂閱supervisord發送的event。他的名字就叫 listener了。咱們能夠在listener裏面作一系列處理,好比報警等等 樓主這兩天干的活,就是弄的這玩意 command=/bin/eventlistener ; 這個和上面的program同樣,表示listener的可執行文件的路徑 process_name=%(program_name)s ; 這個也同樣,進程名,當下面的numprocs爲多個的時候,才須要。不然默認就 OK了 numprocs=1 ; 相同的listener啓動的個數 events=EVENT ; event事件的類型,也就是說,只有寫在這個地方的事件類型。纔會被髮送 buffer_size=10 ; 這個是event隊列緩存大小,單位不太清楚,樓主猜想應該是個吧。當buffer 超過10的時候,最舊的event將會被清除,並把新的event放進去。 默認值爲10。。非必須選項 directory=/tmp ; 進程執行前,會切換到這個目錄下執行 默認爲不切換。。。非必須 umask=022 ; 淹沒,默認爲none,不說了 priority=-1 ; 啓動優先級,默認-1,也不扯了 autostart=true ; 是否隨supervisord啓動一塊兒啓動,默認true autorestart=unexpected ; 是否自動重啓,和program一個樣,分true,false,unexpected等,注意 unexpected和exitcodes的關係 startsecs=1 ; 也是同樣,進程啓動後跑了幾秒鐘,才被認定爲成功啓動,默認1 startretries=3 ; 失敗最大嘗試次數,默認3 exitcodes=0,2 ; 指望或者說預料中的進程退出碼, stopsignal=QUIT ; 幹掉進程的信號,默認爲TERM,好比設置爲QUIT,那麼若是QUIT來幹這個進程 那麼會被認爲是正常維護,退出碼也被認爲是expected中的 stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10) stopasgroup=false ; send stop signal to the UNIX process group (default false) killasgroup=false ; SIGKILL the UNIX process group (def false) user=chrism ;設置普通用戶,能夠用來管理該listener進程。 默認爲空。。非必須設置 redirect_stderr=true ; 爲true的話,stderr的log會併入stdout的log裏面 默認爲false。。。非必須設置 stdout_logfile=/a/path ; 這個不說了,好幾遍了 stdout_logfile_maxbytes=1MB ; 這個也是 stdout_logfile_backups=10 ; 這個也是 stdout_events_enabled=false ; 這個實際上是錯的,listener是不能發送event stderr_logfile=/a/path ; 這個也是 stderr_logfile_maxbytes=1MB ; 這個也是 stderr_logfile_backups ; 這個不說了 stderr_events_enabled=false ; 這個也是錯的,listener不能發送event environment=A="1",B="2" ; 這個是該子進程的環境變量 默認爲空。。。非必須設置 serverurl=AUTO ; override serverurl computation (childutils) The below sample group section shows all possible group values, create one or more 'real' group: sections to create "heterogeneous" process groups. [group:thegroupname] ;這個東西就是給programs分組,劃分到組裏面的program。咱們就不用一個一個去操做了 咱們能夠對組名進行統一的操做。 注意:program被劃分到組裏面以後,就至關於原來 的配置從supervisor的配置文件裏消失了。。。supervisor只會對組進行管理,而再也不 會對組裏面的單個program進行管理了 programs=progname1,progname2 ; 組成員,用逗號分開 這個是個必須的設置項 priority=999 ; 優先級,相對於組和組之間說的 默認999。。非必須選項 The [include] section can just contain the "files" setting. This setting can list multiple files (separated by whitespace or newlines). It can also contain wildcards. The filenames are interpreted as relative to this file. Included files *cannot* include files themselves. [include] ;這個東西挺有用的,當咱們要管理的進程不少的時候,寫在一個文件裏面 就有點大了。咱們能夠把配置信息寫到多個文件中,而後include過來 files = relative/directory/*.ini Nginx配置文件nginx.conf中文詳解 http://www.cnblogs.com/hunttown/p/5759959.html #定義Nginx運行的用戶和用戶組user www www; #nginx進程數,建議設置爲等於CPU總核心數。 worker_processes 8; #全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ] error_log /usr/local/nginx/logs/error.log info; #進程pid文件 pid /usr/local/nginx/logs/nginx.pid; #指定進程能夠打開的最大描述符:數目 #工做模式與鏈接數上限 #這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,可是nginx分配請求並非那麼均勻,因此最好與ulimit -n 的值保持一致。 #如今在linux 2.6內核下開啓文件打開數爲65535,worker_rlimit_nofile就相應應該填寫65535。 #這是由於nginx調度時分配請求到進程並非那麼的均衡,因此假如填寫10240,總併發量達到3-4萬時就有進程可能超過10240了,這時會返回502錯誤。 worker_rlimit_nofile 65535; events { #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型 #是Linux 2.6以上版本內核中的高性能網絡I/O模型,linux建議epoll,若是跑在FreeBSD上面,就用kqueue模型。 #補充說明: #與apache相類,nginx針對不一樣的操做系統,有不一樣的事件模型 #A)標準事件模型 #Select、poll屬於標準事件模型,若是當前系統不存在更有效的方法,nginx會選擇select或poll #B)高效事件模型 #Kqueue:使用於FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會形成內核崩潰。 #Epoll:使用於Linux內核2.6版本及之後的系統。 #/dev/poll:使用於Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 #Eventport:使用於Solaris 10。 爲了防止出現內核崩潰的問題, 有必要安裝安全補丁。 use epoll; #單個進程最大鏈接數(最大鏈接數=鏈接數*進程數) #根據硬件調整,和前面工做進程配合起來用,儘可能大,可是別把cpu跑到100%就行。每一個進程容許的最多鏈接數,理論上每臺nginx服務器的最大鏈接數爲。 worker_connections 65535; #keepalive超時時間。 keepalive_timeout 60; #客戶端請求頭部的緩衝區大小。這個能夠根據你的系統分頁大小來設置,通常一個請求頭的大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。 #分頁大小能夠用命令getconf PAGESIZE 取得。 #[root@web001 ~]# getconf PAGESIZE #4096 #但也有client_header_buffer_size超過4k的狀況,可是client_header_buffer_size該值必須設置爲「系統分頁大小」的整倍數。 client_header_buffer_size 4k; #這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指通過多長時間文件沒被請求後刪除緩存。 open_file_cache max=65535 inactive=60s; #這個是指多長時間檢查一次緩存的有效信息。 #語法:open_file_cache_valid time 默認值:open_file_cache_valid 60 使用字段:http, server, location 這個指令指定了什麼時候須要檢查open_file_cache中緩存項目的有效信息. open_file_cache_valid 80s; #open_file_cache指令中的inactive參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive時間內一次沒被使用,它將被移除。 #語法:open_file_cache_min_uses number 默認值:open_file_cache_min_uses 1 使用字段:http, server, location 這個指令指定了在open_file_cache指令無效的參數中必定的時間範圍內可使用的最小文件數,若是使用更大的值,文件描述符在cache中老是打開狀態. open_file_cache_min_uses 1; #語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤. open_file_cache_errors on; } #設定http服務器,利用它的反向代理功能提供負載均衡支持 http{ #文件擴展名與文件類型映射表 include mime.types; #默認文件類型 default_type application/octet-stream; #默認編碼 #charset utf-8; #服務器名字的hash表大小 #保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。參數hash bucket size老是等於hash表的大小,而且是一路處理器緩存大小的倍數。在減小了在內存中的存取次數後,使在處理器中加速查找hash表鍵值成爲可能。若是hash bucket size等於一路處理器緩存的大小,那麼在查找鍵的時候,最壞的狀況下在內存中查找的次數爲2。第一次是肯定存儲單元的地址,第二次是在存儲單元中查找鍵 值。所以,若是Nginx給出須要增大hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小. server_names_hash_bucket_size 128; #客戶端請求頭部的緩衝區大小。這個能夠根據你的系統分頁大小來設置,通常一個請求的頭部大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。分頁大小能夠用命令getconf PAGESIZE取得。 client_header_buffer_size 32k; #客戶請求頭緩衝大小。nginx默認會用client_header_buffer_size這個buffer來讀取header值,若是header過大,它會使用large_client_header_buffers來讀取。 large_client_header_buffers 4 64k; #設定經過nginx上傳文件的大小 client_max_body_size 8m; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。注意:若是圖片顯示不正常把這個改爲off。 #sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,下降系統uptime。 sendfile on; #開啓目錄列表訪問,合適下載服務器,默認關閉。 autoindex off; #此選項容許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用 tcp_nopush on; tcp_nodelay on; #長鏈接超時時間,單位是秒 keepalive_timeout 120; #FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。下面參數看字面意思都能理解。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip模塊設置 gzip on; #開啓gzip壓縮輸出 gzip_min_length 1k; #最小壓縮文件大小 gzip_buffers 4 16k; #壓縮緩衝區 gzip_http_version 1.0; #壓縮版本(默認1.1,前端若是是squid2.5請使用1.0) gzip_comp_level 2; #壓縮等級 gzip_types text/plain application/x-javascript text/css application/xml; #壓縮類型,默認就已經包含textml,因此下面就不用再寫了,寫上去也不會有問題,可是會有一個warn。 gzip_vary on; #開啓限制IP鏈接數的時候須要使用 #limit_zone crawler $binary_remote_addr 10m; #負載均衡配置 upstream piao.jd.com { #upstream的負載均衡,weight是權重,能夠根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的概率越大。 server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; #nginx的upstream目前支持4種方式的分配 #一、輪詢(默認) #每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。 #二、weight #指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。 #例如: #upstream bakend { # server 192.168.0.14 weight=10; # server 192.168.0.15 weight=10; #} #二、ip_hash #每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。 #例如: #upstream bakend { # ip_hash; # server 192.168.0.14:88; # server 192.168.0.15:80; #} #三、fair(第三方) #按後端服務器的響應時間來分配請求,響應時間短的優先分配。 #upstream backend { # server server1; # server server2; # fair; #} #四、url_hash(第三方) #按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。 #例:在upstream中加入hash語句,server語句中不能寫入weight等其餘的參數,hash_method是使用的hash算法 #upstream backend { # server squid1:3128; # server squid2:3128; # hash $request_uri; # hash_method crc32; #} #tips: #upstream bakend{#定義負載均衡設備的Ip及設備狀態}{ # ip_hash; # server 127.0.0.1:9090 down; # server 127.0.0.1:8080 weight=2; # server 127.0.0.1:6060; # server 127.0.0.1:7070 backup; #} #在須要使用負載均衡的server中增長 proxy_pass http://bakend/; #每一個設備的狀態設置爲: #1.down表示單前的server暫時不參與負載 #2.weight爲weight越大,負載的權重就越大。 #3.max_fails:容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤 #4.fail_timeout:max_fails次失敗後,暫停的時間。 #5.backup: 其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。 #nginx支持同時設置多組的負載均衡,用來給不用的server來使用。 #client_body_in_file_only設置爲On 能夠講client post過來的數據記錄到文件中用來作debug #client_body_temp_path設置記錄文件的目錄 能夠設置最多3層目錄 #location對URL進行匹配.能夠進行重定向或者進行新的代理 負載均衡 } #虛擬主機的配置 server { #監聽端口 listen 80 ; #域名能夠有多個,用空格隔開 server_name www.jd.comjd.com; index index.html index.htm index.php; root /data/www/jd; #對******進行負載均衡 location ~ .*.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #圖片緩存時間設置 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } #JS和CSS緩存時間設置 location ~ .*.(js|css)?$ { expires 1h; } #日誌格式設定 #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址; #$remote_user:用來記錄客戶端用戶名稱; #$time_local: 用來記錄訪問時間與時區; #$request: 用來記錄請求的url與http協議; #$status: 用來記錄請求狀態;成功是200, #$body_bytes_sent :記錄發送給客戶端文件主體內容大小; #$http_referer:用來記錄從那個頁面連接訪問過來的; #$http_user_agent:記錄客戶瀏覽器的相關信息; #一般web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,經過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,能夠增長x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定義本虛擬主機的訪問日誌 access_log /usr/local/nginx/logs/host.access.log main; access_log /usr/local/nginx/logs/host.access.404.log log404; #對 "/" 啓用反向代理 location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #如下是一些反向代理的配置,可選。 proxy_set_header Host $host; #容許客戶端請求的最大單文件字節數 client_max_body_size 10m; #緩衝區代理緩衝用戶端請求的最大字節數, #若是把它設置爲比較大的數值,例如256k,那麼,不管使用firefox仍是IE瀏覽器,來提交任意小於256k的圖片,都很正常。若是註釋該指令,使用默認的client_body_buffer_size設置,也就是操做系統頁面大小的兩倍,8k或者16k,問題就出現了。 #不管使用firefox4.0仍是IE8.0,提交一個比較大,200k左右的圖片,都返回500 Internal Server Error錯誤 client_body_buffer_size 128k; #表示使nginx阻止HTTP應答代碼爲400或者更高的應答。 proxy_intercept_errors on; #後端服務器鏈接的超時時間_發起握手等候響應超時時間 #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_connect_timeout 90; #後端服務器數據回傳時間(代理髮送超時) #後端服務器數據回傳時間_就是在規定時間以內後端服務器必須傳完全部的數據 proxy_send_timeout 90; #鏈接成功後,後端服務器響應時間(代理接收超時) #鏈接成功後_等候後端服務器響應時間_其實已經進入後端的排隊之中等候處理(也能夠說是後端服務器處理請求的時間) proxy_read_timeout 90; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 #設置從被代理服務器讀取的第一部分應答的緩衝區大小,一般狀況下這部分應答中包含一個小的應答頭,默認狀況下這個值的大小爲指令proxy_buffers中指定的一個緩衝區的大小,不過能夠將其設置爲更小 proxy_buffer_size 4k; #proxy_buffers緩衝區,網頁平均在32k如下的設置 #設置用於讀取應答(來自被代理服務器)的緩衝區數目和大小,默認狀況也爲分頁大小,根據操做系統的不一樣多是4k或者8k proxy_buffers 4 32k; #高負荷下緩衝大小(proxy_buffers*2) proxy_busy_buffers_size 64k; #設置在寫入proxy_temp_path時數據的大小,預防一個工做進程在傳遞文件時阻塞太長 #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 proxy_temp_file_write_size 64k; } #設定查看Nginx狀態的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file confpasswd; #htpasswd文件的內容能夠用apache提供的htpasswd工具來產生。 } #本地動靜分離反向代理配置 #全部jsp的頁面均交由tomcat或resin處理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #全部靜態文件由nginx直接讀取不通過應用服務器 location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt| pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } } } Nginx判斷語句 http://www.cnblogs.com/songxingzhu/p/6382007.html Nginx中if語句中的判斷條件 1、if語句中的判斷條件(nginx) 1、正則表達式匹配: ==:等值比較; ~:與指定正則表達式模式匹配時返回「真」,判斷匹配與否時區分字符大小寫; ~*:與指定正則表達式模式匹配時返回「真」,判斷匹配與否時不區分字符大小寫; !~:與指定正則表達式模式不匹配時返回「真」,判斷匹配與否時區分字符大小寫; !~*:與指定正則表達式模式不匹配時返回「真」,判斷匹配與否時不區分字符大小寫; 2、文件及目錄匹配判斷: -f, !-f:判斷指定的路徑是否爲存在且爲文件; -d, !-d:判斷指定的路徑是否爲存在且爲目錄; -e, !-e:判斷指定的路徑是否存在,文件或目錄都可; -x, !-x:判斷指定路徑的文件是否存在且可執行; 2、例子: 有些公司可能有這樣的需求,如:個人網站或者網頁遊戲須要更新,全部的用戶或者玩家訪問到的是一個停服更新頁面,而本公司的IP能夠訪問,甚至說本公司的某個內網IP能夠訪問,用於確認更新成功與否,針對這個問題寫了以下的訪問控制規則: Nginx多重條件判斷(只是一個簡單的例子,本身能夠更改或者增長更多的判斷條件),下面是兩個例子和寫法: 一、能夠做爲nginx的停服更新使用,僅容許222.222.222.222或者內網的兩個IP訪問,其餘IP都rewrite到停服頁面 Nginx.conf中加入在你項目的正確位置 set $my_ip ''; if ( $remote_addr = 222.222.222.222){set $my_ip 1;} #注意這裏的$remote_addr如何用了負載均衡的話,這裏應該是$http_x_forwarded_for if ( $remote_addr = 192.168.1.170 ){ set $my_ip 1;} if ( $remote_addr = 192.168.1.169 ){ set $my_ip 1;} if ( $my_ip != 1) {rewrite ^/design/(.*)\.php$ /tingfu.html?$1&;} #將*.php轉到tingfu.html 2、訪問某個php應用的時候我只想讓內部的某個IP訪問,其餘的IP都轉到另外一個PHP上。以下: 訪問test.php,且IP不等222.222.222.222的跳轉到55555.php: set $test ''; if ( $request_uri ~* /img/test.php ) { set $test P; } if ( $http_x_forwarded_for !~* ^222\.222\.222\.222.* ) { set $test "${test}C"; } if ( $test = PC ) { #當條件符合 訪問test.php而且 ip不是222.222.222.222的 轉發到55555.php rewrite ^(.*)$ /img/55555.php permanent; } 關於 Nginx upstream keepalive 的說明 https://www.cnblogs.com/kabi/p/7123354.html celery 文檔 http://docs.jinkan.org/docs/celery/ 安裝celery pip install celery 何爲任務隊列? 任務隊列是一種在線程或機器間分發任務的機制。 消息隊列的輸入是工做的一個單元,稱爲任務,獨立的職程(Worker)進程持續監視隊列中是否有須要處理的新任務。 Celery 用消息通訊,一般使用中間人(Broker)在客戶端和職程間斡旋。這個過程從客戶端向隊列添加消息開始,以後中間人把消息派送給職程。 Celery 系統可包含多個職程和中間人,以此得到高可用性和橫向擴展能力。 Celery 是用 Python 編寫的,但協議能夠用任何語言實現。迄今,已有 Ruby 實現的 RCelery 、node.js 實現的 node-celery 以及一個 PHP 客戶端 ,語言互通也能夠經過 using webhooks 實現。 執行任務的返回值: aa =adds.delay(11, 44) print aa.ready() #當任務完成時是True ,不然FALSE print aa.result #當即返回結果,若是沒有結果返回none print aa.get() #阻塞等待返回值 定時任務配置 #celery配置信息 BROKER_URL = 'redis://127.0.0.1:6379/0' CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1' CELERY_TIMEZONE = 'Asia/Shanghai' # 設置時區 from datetime import timedelta CELERYBEAT_SCHEDULE = { 'add-5-seconds': { #任務名稱 'task': 'create_app.adds', #設置執行的任務 'schedule': timedelta(seconds=5), #設置間隔時間 'args': (30, 16) #設置參數 } } 啓動worker, -B能夠同時啓動定時任務 $ celery worker -A celery_test_module -l info -c 3 -B 啓動定時任務 (flak_test) pyvip@ubuntu:~/flask_test_001$ celery -A create_app.celery beat -l info <qiniu.auth.Auth object at 0xb5da338c> ---------------- celery beat v4.1.0 (latentcall) is starting. __ - ... __ - _ LocalTime -> 2017-11-16 15:19:09 Configuration -> . broker -> redis://127.0.0.1:6379/0 . loader -> celery.loaders.app.AppLoader . scheduler -> celery.beat.PersistentScheduler . db -> celerybeat-schedule . logfile -> [stderr]@%INFO . maxinterval -> 5.00 minutes (300s) [2017-11-16 15:19:09,570: INFO/MainProcess] beat: Starting... [2017-11-16 15:19:09,596: INFO/MainProcess] Scheduler: Sending due task add-5-seconds (create_app.adds) [2017-11-16 15:19:14,591: INFO/MainProcess] Scheduler: Sending due task add-5-seconds (create_app.adds) [2017-11-16 15:19:19,591: INFO/MainProcess] Scheduler: Sending due task add-5-seconds (create_app.adds) [2017-11-16 15:19:24,591: INFO/MainProcess] Scheduler: Sending due task add-5-seconds (create_app.adds) [2017-11-16 15:19:29,591: INFO/MainProcess] Scheduler: Sending due task add-5-seconds (create_app.adds) 啓動worker (flak_test) pyvip@ubuntu:~/flask_test_001$ celery worker -A create_app.celery --loglevel=info --concurrency=5 -------------- celery@ubuntu v4.1.0 (latentcall) ---- **** ----- --- * *** * -- Linux-4.4.0-98-generic-i686-with-Ubuntu-16.04-xenial 2017-11-16 15:20:54 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: create_app:0xb5d5690c - ** ---------- .> transport: redis://127.0.0.1:6379/0 - ** ---------- .> results: redis://127.0.0.1:6379/1 - *** --- * --- .> concurrency: 5 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . create_app.adds [2017-11-16 15:20:54,252: INFO/MainProcess] Connected to redis://127.0.0.1:6379/0 [2017-11-16 15:20:54,260: INFO/MainProcess] mingle: searching for neighbors [2017-11-16 15:20:55,276: INFO/MainProcess] mingle: all alone [2017-11-16 15:20:55,293: INFO/MainProcess] celery@ubuntu ready. [2017-11-16 15:21:00,728: INFO/MainProcess] Received task: create_app.adds[b473380e-6dc2-495c-a065-da2ad477e9f0] [2017-11-16 15:21:00,730: WARNING/ForkPoolWorker-1] period task done: b473380e-6dc2-495c-a065-da2ad477e9f0 [2017-11-16 15:21:00,731: WARNING/ForkPoolWorker-1] aaaaaa [2017-11-16 15:21:00,733: INFO/ForkPoolWorker-1] Task create_app.adds[b473380e-6dc2-495c-a065-da2ad477e9f0] succeeded in 0.00327149399982s: 46 [2017-11-16 15:21:05,710: INFO/MainProcess] Received task: create_app.adds[5bc9046e-e83e-45bc-a610-061bb420703f] [2017-11-16 15:21:05,715: WARNING/ForkPoolWorker-5] period task done: 5bc9046e-e83e-45bc-a610-061bb420703f [2017-11-16 15:21:05,720: WARNING/ForkPoolWorker-5] aaaaaa [2017-11-16 15:21:05,726: INFO/ForkPoolWorker-5] Task create_app.adds[5bc9046e-e83e-45bc-a610-061bb420703f] succeeded in 0.0113880900003s: 46 同時啓動beat 和worker (flak_test) pyvip@ubuntu:~/flask_test_001$ celery worker -A create_app.celery --beat --loglevel=info --concurrency=5 <qiniu.auth.Auth object at 0xb5d76e6c> ---------------- -------------- celery@ubuntu v4.1.0 (latentcall) ---- **** ----- --- * *** * -- Linux-4.4.0-98-generic-i686-with-Ubuntu-16.04-xenial 2017-11-16 16:11:49 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: create_app:0xb5d8342c - ** ---------- .> transport: redis://127.0.0.1:6379/0 - ** ---------- .> results: redis://127.0.0.1:6379/1 - *** --- * --- .> concurrency: 5 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . create_app.adds [2017-11-16 16:11:49,477: INFO/Beat] beat: Starting... [2017-11-16 16:11:49,487: INFO/MainProcess] Connected to redis://127.0.0.1:6379/0 [2017-11-16 16:11:49,503: INFO/MainProcess] mingle: searching for neighbors [2017-11-16 16:11:49,533: INFO/Beat] Scheduler: Sending due task adds-5-seconds (create_app.adds) [2017-11-16 16:11:50,534: INFO/MainProcess] mingle: all alone [2017-11-16 16:11:50,558: INFO/MainProcess] celery@ubuntu ready. [2017-11-16 16:11:50,681: INFO/MainProcess] Received task: create_app.adds[ae1326b3-f7b0-4e00-b572-397de04e9bfd] [2017-11-16 16:11:50,687: WARNING/ForkPoolWorker-2] period task done: ae1326b3-f7b0-4e00-b572-397de04e9bfd [2017-11-16 16:11:50,693: WARNING/ForkPoolWorker-2] aaaaaa [2017-11-16 16:11:52,700: INFO/ForkPoolWorker-2] Task create_app.adds[ae1326b3-f7b0-4e00-b572-397de04e9bfd] succeeded in 2.012950648s: 46 [2017-11-16 16:12:07,131: INFO/MainProcess] Received task: create_app.adds[1803249c-3d9c-49d4-be42-34b0995708eb] [2017-11-16 16:12:07,133: WARNING/ForkPoolWorker-5] period task done: 1803249c-3d9c-49d4-be42-34b0995708eb [2017-11-16 16:12:07,136: WARNING/ForkPoolWorker-5] aaaaaa [2017-11-16 16:12:07,525: INFO/MainProcess] Received task: create_app.adds[00434f68-2420-4664-9ee6-3279ea35dd1f] [2017-11-16 16:12:07,527: WARNING/ForkPoolWorker-4] period task done: 00434f68-2420-4664-9ee6-3279ea35dd1f [2017-11-16 16:12:07,529: WARNING/ForkPoolWorker-4] aaaaaa [2017-11-16 16:12:09,148: INFO/ForkPoolWorker-5] Task create_app.adds[1803249c-3d9c-49d4-be42-34b0995708eb] succeeded in 2.014733645s: 55 能夠開兩個窗口,分別啓動worker能夠集羣方式執行任務
相關文章
相關標籤/搜索