python服務(wù)器環(huán)境搭建(3)——參數(shù)配置
前面我們已安裝好了Python服務(wù)器運(yùn)行所需要的相關(guān)軟件,而最重要最繁瑣的就是參數(shù)配置,寫(xiě)這篇就踩了好多坑,花了好多時(shí)間,遇到了各種各樣的問(wèn)題。好了費(fèi)話少說(shuō),直接進(jìn)入本篇話題。
一、優(yōu)化服務(wù)器網(wǎng)絡(luò)環(huán)境
在開(kāi)始配置服務(wù)器前,我們需要先對(duì)服務(wù)器環(huán)境配置進(jìn)行優(yōu)化,提升服務(wù)器的訪問(wèn)數(shù)和處理數(shù)
輸入命令:vi /etc/sysctl.conf
將里面值替換為下面參數(shù)
#?sysctl?settings?are?defined?through?files?in #?/usr/lib/sysctl.d/,?/run/sysctl.d/,?and?/etc/sysctl.d/. # #?Vendors?settings?live?in?/usr/lib/sysctl.d/. #?To?override?a?whole?file,?create?a?new?file?with?the?same?in #?/etc/sysctl.d/?and?put?new?settings?there.?To?override #?only?specific?settings,?add?a?file?with?a?lexically?later #?name?in?/etc/sysctl.d/?and?put?new?settings?there. # #?For?more?information,?see?sysctl.conf(5)?and?sysctl.d(5). net.ipv6.conf.all.disable_ipv6?=?1 net.ipv6.conf.default.disable_ipv6?=?1 net.ipv6.conf.lo.disable_ipv6?=?1 vm.swappiness?=?0 net.ipv4.neigh.default.gc_stale_time=120 #?see?details?in?https://help.aliyun.com/knowledge_detail/39428.html net.ipv4.conf.all.rp_filter=0 #?net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.arp_announce?=?2 net.ipv4.conf.lo.arp_announce=2 net.ipv4.conf.all.arp_announce=2 #?see?details?in?https://help.aliyun.com/knowledge_detail/41334.html #?net.ipv4.tcp_max_tw_buckets?=?5000 #?net.ipv4.tcp_syncookies?=?1 #?net.ipv4.tcp_max_syn_backlog?=?1024 net.ipv4.tcp_synack_retries?=?2 net.ipv4.ip_forward?=?0 net.ipv4.conf.default.rp_filter?=?1 net.ipv4.conf.default.accept_source_route?=?0 kernel.sysrq?=?0 kernel.core_uses_pid?=?1 net.ipv4.tcp_syncookies?=?1 kernel.msgmnb?=?65536 kernel.msgmax?=?65536 kernel.shmmax?=?68719476736 kernel.shmall?=?4294967296 net.ipv4.tcp_max_tw_buckets?=?6000 net.ipv4.tcp_sack?=?1 net.ipv4.tcp_window_scaling?=?1 net.ipv4.tcp_rmem?=?4096?87380?4194304 net.ipv4.tcp_wmem?=?4096?16384?4194304 net.core.wmem_default?=?8388608 net.core.rmem_default?=?8388608 net.core.rmem_max?=?16777216 net.core.wmem_max?=?16777216 net.core.netdev_max_backlog?=?262144 #?net.core.somaxconn?=?262144 net.core.somaxconn?=?2048 net.ipv4.tcp_max_orphans?=?3276800 net.ipv4.tcp_max_syn_backlog?=?262144 net.ipv4.tcp_timestamps?=?0 net.ipv4.tcp_syn_retries?=?1 net.ipv4.tcp_tw_recycle?=?1 net.ipv4.tcp_tw_reuse?=?1 net.ipv4.tcp_mem?=?94500000?915000000?927000000 net.ipv4.tcp_fin_timeout?=?1 net.ipv4.tcp_keepalive_time?=?10 net.ipv4.tcp_keepalive_probes=5 net.ipv4.ip_local_port_range?=?1024?65535
輸入命令讓配置生效:sysctl -p
輸入命令:echo "options sunrpc tcp_slot_table_entries=256" >> /etc/modprobe.d/sunrpc.conf
寫(xiě)入配置:sysctl -w sunrpc.tcp_slot_table_entries=256
重啟服務(wù)器,再查看一下配置就可以看到配置參數(shù)值已經(jīng)改變了(有的服務(wù)器可能不存在這兩個(gè)文件,不運(yùn)行問(wèn)題也不大)
輸入命令:cat /proc/sys/sunrpc/tcp_slot_table_entries
輸入命令:cat /proc/sys/sunrpc/tcp_max_slot_table_entries
一個(gè)是256,一個(gè)是65536了
二、讓你的python代碼跑起來(lái)
既然我們要配置的是python服務(wù)器,那首先我們要做的第一步是,放上我們的python代碼,看看能否運(yùn)行并訪問(wèn)
先上代碼,將下面代碼粘貼到記事本上并存儲(chǔ)為main.py(這個(gè)文名可以隨便起,我存儲(chǔ)的格式為ANSI格式,即記事本默認(rèn)的格式)
#!/usr/bin/evn?python #?coding=utf-8 from?bottle?import?default_app,?get,?run from?beaker.middleware?import?SessionMiddleware @get('/index/') def?callback(): ????return?'Hello?World!' if?__name__?==?'__main__': ????app_argv?=?SessionMiddleware(default_app()) ????run(app=app_argv,?host='0.0.0.0',?port=8088,?debug=True,?reloader=True) else: ????application?=?SessionMiddleware(default_app())
我們?yōu)榱朔奖阋院髮?duì)服務(wù)器的管理,需要?jiǎng)?chuàng)建一個(gè)指定的文件夾(如果有掛載新硬盤(pán)的,可以將這個(gè)文件夾綁定到該目錄),將日志、數(shù)據(jù)庫(kù)、web站、后臺(tái)服務(wù)、svn等內(nèi)容統(tǒng)一放到指定文件夾下面
首先在根目錄下創(chuàng)建一個(gè)data文件夾(后面的各種日志、web站點(diǎn)等全都放在這里統(tǒng)一管理,以后我們要查找時(shí)就很方便了)
輸入命令:mkdir /data
創(chuàng)建python web存儲(chǔ)目錄:mkdir /data/www
創(chuàng)建測(cè)試目錄:mkdir /data/www/test
然后使用SSH的上傳工具,上傳剛剛創(chuàng)建好的main.py文件到www目錄下的test文件夾
后面的上傳用這個(gè)上傳工具處理(也可以直接使用vi進(jìn)行編輯)不再截圖
然后我們運(yùn)行:python /data/www/test/main.py??(或進(jìn)入test目錄運(yùn)行:python main.py)
運(yùn)行后會(huì)顯示ImportError: No module named bottle錯(cuò)誤,這是因?yàn)槲覀兊某绦蛘{(diào)用了bottle包,而我們未安裝這個(gè)依賴(lài)包,需要安裝后程序才能正常運(yùn)行,以后在使用python中碰到這種情況,直接輸入pip install xxx即可
安裝bottle包:pip3 install bottle
安裝beaker包:pip3 install?beaker
然后再次輸入:python main.py
就會(huì)發(fā)現(xiàn)python web服務(wù)運(yùn)行起來(lái)了
然后關(guān)閉防火墻:systemctl stop firewalld? (如果瀏覽器訪問(wèn)不了,可以運(yùn)行這個(gè)命令來(lái)關(guān)閉防火墻)
打開(kāi)瀏覽器輸入:http://192.168.0.128:8088/index/??就可以看到Hello World!了
為了方便后面的測(cè)試,我們按Ctrl+C,關(guān)閉剛才python啟動(dòng)的main.py服務(wù)
三、使用supervisord來(lái)管理python進(jìn)程
supervisord默認(rèn)配置文件存放路徑是/etc/目錄下面,安裝完成后配置文件是不存在的,需要使用命令生成或我們自己放一個(gè)進(jìn)去,我們先配置一個(gè)簡(jiǎn)單的不使用uwsgi的配置文件
文件名稱(chēng):supervisord.conf (我存儲(chǔ)的格式為ANSI格式,即記事本默認(rèn)的格式)
[unix_http_server] file=/tmp/supervisor.sock???;?(the?path?to?the?socket?file) [supervisord] logfile=/data/logs/supervisord/supervisord.log?;?(main?log?file;default?$CWD/supervisord.log) logfile_maxbytes=10MB????????;?(max?main?logfile?bytes?b4?rotation;default?50MB) logfile_backups=2???????????;?(num?of?main?logfile?rotation?backups;default?10) loglevel=info????????????????;?(log?level;default?info;?others:?debug,warn,trace) pidfile=/tmp/supervisord.pid?;?(supervisord?pidfile;default?supervisord.pid) nodaemon=false???????????????;?(start?in?foreground?if?true;default?false) minfds=1024??????????????????;?(min.?avail?startup?file?descriptors;default?1024) minprocs=200?????????????????;?(min.?avail?process?descriptors;default?200) [rpcinterface:supervisor] supervisor.rpcinterface_factory?=?supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock?;?use?a?unix://?URL??for?a?unix?socket [program:test] command=python?/data/www/test/main.py????;?supervisord將要執(zhí)行的運(yùn)行python服務(wù)的命令 directory=/data/www/test stdout_logfile=/data/logs/supervisord/test_supervisord.log????;?supervisord當(dāng)前這個(gè)test服務(wù)運(yùn)行產(chǎn)生的日志存儲(chǔ)路徑,方便我們查看運(yùn)行情況 socket-timeout=3 autostart=true autorestart=true redirect_stderr=true stopsignal=QUIT
使用上傳工具上傳到/etc/supervisord.conf
為了規(guī)范日志管理,我們?cè)赿ata文件夾下繼續(xù)創(chuàng)建對(duì)應(yīng)的日志文件夾,以后查找supervisord日志就可以在下面創(chuàng)建的文件夾中查看了
輸入命令:mkdir /data/logs
輸入命令:mkdir /data/logs/supervisord
由于supervisord目前只支持python2,所以運(yùn)行時(shí)需要用python2來(lái)啟動(dòng)
啟動(dòng)supervisord服務(wù):/usr/bin/python2.7 /usr/bin/supervisord
我們繼續(xù)在瀏覽器中輸入http://192.168.0.128:8088/index/ 可以發(fā)現(xiàn)還是可以正常訪問(wèn),看到Hello World!(前面執(zhí)行python /data/www/test/main.py后,按Ctrl+C就直接退出了,用瀏覽器是無(wú)法正常訪問(wèn)的,現(xiàn)在的訪問(wèn)是supervisord啟動(dòng)的)
使用supervisord啟動(dòng)的python進(jìn)程可以發(fā)現(xiàn),我們用kill xxx命令來(lái)直接關(guān)閉python進(jìn)程,關(guān)閉后supervisord會(huì)重新啟動(dòng)新的進(jìn)程,也就是說(shuō)不kill掉supervisord進(jìn)程,是無(wú)法殺死supervisord啟動(dòng)的python進(jìn)程的
PS:由于python2.7.5與python3.5.4并存,在對(duì)supervisord配置進(jìn)行修改以后,使用命令:/usr/bin/supervisord -v執(zhí)行時(shí),會(huì)出現(xiàn)?ImportError: No module named 'supervisor'?這個(gè)錯(cuò)誤,雖然我們前面用的是python2.7.5來(lái)啟動(dòng)supervisord服務(wù)的,但生成執(zhí)行命令時(shí),默認(rèn)還是用python這個(gè)鏈接,所以我們需要對(duì)/usr/bin/supervisord和/usr/bin/supervisorctl進(jìn)行修改
執(zhí)行命令:vi?/usr/bin/supervisord
將第一行的#!/usr/bin/python?改為?#!/usr/bin/python2.7.5
執(zhí)行命令:vi?/usr/bin/supervisorctl
將第一行的#!/usr/bin/python?改為?#!/usr/bin/python2.7.5
我們?cè)賵?zhí)行:/usr/bin/supervisord -v時(shí)就正常了
四、將nginx與supervisord關(guān)聯(lián)起來(lái)(使用代理方式,非uwsgi)
首先我們要為nginx創(chuàng)建對(duì)應(yīng)的訪問(wèn)賬號(hào)
輸入命令:/usr/sbin/groupadd -f www
輸入命令:/usr/sbin/useradd -g www www
為nginx創(chuàng)建對(duì)應(yīng)的日志管理文件夾
輸入命令:mkdir /data/logs/nginx
因?yàn)閚ginx的配置默認(rèn)全部是在nginx.conf里設(shè)置的,網(wǎng)站多時(shí)管理不方便,所以我們需要?jiǎng)?chuàng)建一個(gè)文件夾,將每個(gè)獨(dú)立的網(wǎng)站配置放在里面
創(chuàng)建nginx配置統(tǒng)一管理文件夾:mkdir?/usr/local/nginx/conf/vhost
修改/usr/local/nginx/conf/nginx.conf配置文件內(nèi)容,替換成下面參數(shù)
user?www?www; worker_processes??1; worker_rlimit_nofile?10240; error_log?/data/logs/nginx/error.log?error; events?{ ????use?epoll; ????worker_connections??10240; } http?{ ????log_format??main??'[$time_local]?$remote_addr??$upstream_addr??$status??$body_bytes_sent??[$request_time]?' ??????????????????????'"$request"?"$http_referer"?' ??????????????????????'"$http_user_agent"?"$http_x_forwarded_for"'; ????include???????mime.types; ????default_type??application/octet-stream; ????sendfile????????on; ????tcp_nopush?????on; ????tcp_nodelay?on; ????server_tokens?off; ???? ????include?vhost/*.conf; }
創(chuàng)建test.conf文件(內(nèi)容見(jiàn)下面代碼)并上傳到剛創(chuàng)建的/usr/local/nginx/conf/vhost/目錄下,具體內(nèi)容如下(使用80端口訪問(wèn),將代理地址指定前面配置的8088端口):
server?{ ????listen??????80; ????charset?????utf-8; ????root????????/data/www/test; ????server_name?192.168.0.128; ???? ????location?/?{ ????????proxy_pass??http://127.0.0.1:8088; ????} ????access_log??/data/logs/nginx/test_access.log??main; }
PS:在使用之前,我們需要重新一次服務(wù)器,不然可能會(huì)出現(xiàn)端口被占用訪問(wèn)出現(xiàn)404的問(wèn)題,重啟后就正常
啟動(dòng)nginx服務(wù):?/usr/local/nginx/sbin/nginx
啟動(dòng)supervisord服務(wù):/usr/bin/python2.7 /usr/bin/supervisord
如果修改了nginx配置內(nèi)容,需要重新啟動(dòng)nginx才能生效,重啟命令:?/usr/local/nginx/sbin/nginx
如果啟動(dòng)后沒(méi)有出現(xiàn)錯(cuò)誤信息,就表示啟動(dòng)成功了,可以使用命令來(lái)查詢(xún)啟動(dòng)情況:ps -ef | grep nginx
我們?cè)跒g覽器中輸入http://192.168.0.128/index/可以發(fā)現(xiàn)Hello World!訪問(wèn)正常(PS:可以發(fā)現(xiàn),我們直接訪問(wèn)80端口完全沒(méi)有問(wèn)題)
五、使用nginx+supervisord+uwsgi來(lái)管理python web服務(wù)
首先,我們讓uwsgi運(yùn)行起來(lái)
根據(jù)官網(wǎng)(https://uwsgi-docs.readthedocs.io/en/latest/)說(shuō)明,我們還需要安裝python-devel插件
輸入命令:yum install?python-devel
第一個(gè)Hello World!例子:
輸入命令:vi /tmp/foobar.py
然后點(diǎn)擊鍵盤(pán)?i ?進(jìn)入編輯模式,將下面的代碼粘貼進(jìn)vi編輯器,然后按Esc鍵,按Shift+:,輸入wq+回車(chē)鍵,保存foobar.py文件
def?application(env,?start_response): ????start_response('200?OK',?[('Content-Type','text/html')]) ????return?[b"Hello?World"]
將這個(gè)例子運(yùn)行起來(lái):/usr/bin/uwsgi --http :9090 --wsgi-file /tmp/foobar.py
我們?cè)跒g覽器中輸入網(wǎng)址:http://192.168.0.128:9090/?就可以看到Hello World了
我們按Ctrl+C,關(guān)閉剛才用uwsgi啟動(dòng)的main.py服務(wù)
為了方便uwsgi配置的管理,我們需要在etc目錄下創(chuàng)建uwsgi文件夾,用來(lái)存儲(chǔ)配置文件
輸入命令:mkdir /etc/uwsgi
創(chuàng)建uwsgi日志文件夾:mkdir /data/logs/uwsgi
創(chuàng)建配置文件,并將它上傳到/etc/uwsgi目錄下,配置文件名:test.xml,內(nèi)容如下:
修改/etc/supervisord.conf配置文件內(nèi)容,將command=python /data/www/test/main.py修改為command=/usr/local/bin/uwsgi /etc/uwsgi/test.xml
[unix_http_server] file=/tmp/supervisor.sock???;?(the?path?to?the?socket?file) [supervisord] logfile=/data/logs/supervisord/supervisord.log?;?(main?log?file;default?$CWD/supervisord.log) logfile_maxbytes=10MB????????;?(max?main?logfile?bytes?b4?rotation;default?50MB) logfile_backups=2???????????;?(num?of?main?logfile?rotation?backups;default?10) loglevel=info????????????????;?(log?level;default?info;?others:?debug,warn,trace) pidfile=/tmp/supervisord.pid?;?(supervisord?pidfile;default?supervisord.pid) nodaemon=false???????????????;?(start?in?foreground?if?true;default?false) minfds=1024??????????????????;?(min.?avail?startup?file?descriptors;default?1024) minprocs=200?????????????????;?(min.?avail?process?descriptors;default?200) [rpcinterface:supervisor] supervisor.rpcinterface_factory?=?supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock?;?use?a?unix://?URL??for?a?unix?socket [program:test] command=/usr/bin/uwsgi?/etc/uwsgi/test.xml directory=/data/www/test stdout_logfile=/data/logs/supervisord/test_supervisord.log socket-timeout=3 autostart=true autorestart=true redirect_stderr=true stopsignal=QUIT
修改nginx的配置文件/usr/local/nginx/conf/vhost/test.conf
server?{ ????listen??????80; ????charset?????utf-8; ????root????????/data/www/test; ????server_name?192.168.0.128; ????location?/?{ ????????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_connect_timeout??????2;?????? ????????proxy_send_timeout?????????60;????? ????????proxy_read_timeout?????????60;????? ????????include?uwsgi_params; ????????uwsgi_param?UWSGI_PYHOME?/data/www/test; ????????uwsgi_param?UWSGI_CHDIR?/data/www/test; ????????uwsgi_param?UWSGI_SCRIPT?main; ????????uwsgi_pass??127.0.0.1:8088; ????} ????access_log??/data/logs/nginx/test_access.log??main; }
重啟服務(wù)命令:/usr/local/nginx/sbin/nginx -s reload(如果nginx服務(wù)沒(méi)有啟動(dòng),就使用這個(gè)命令:/usr/local/nginx/sbin/nginx?)
另外,如果我們修改了supervisord的配置文件,則需要運(yùn)行下面命令重啟服務(wù)(如果你又重啟了服務(wù)器,則需要重新啟動(dòng)supervisord服務(wù):/usr/bin/python2.7 /usr/bin/supervisord,否則不用執(zhí)行這個(gè)命令)
載入剛剛修改過(guò)的配置信息:/usr/bin/supervisorctl reread?(運(yùn)行后才可以載入內(nèi)存)
重啟全部supervisord服務(wù):/usr/bin/supervisorctl?reload?(運(yùn)行這個(gè)將會(huì)重啟全部服務(wù),會(huì)比較慢)
PS:其他supervisord命令說(shuō)明
啟動(dòng)或重啟配置修改項(xiàng)對(duì)應(yīng)的服務(wù):/usr/bin/supervisorctl update?(有時(shí)可能會(huì)啟動(dòng)失敗,需要需要其他方式啟動(dòng))
我們更新了python文件,如果沒(méi)有重啟對(duì)應(yīng)的服務(wù)修改是不生效的,即訪問(wèn)時(shí)還是舊的代碼功能,需要重啟對(duì)應(yīng)的服務(wù)才行,比如現(xiàn)在我們的supervisord服務(wù)名稱(chēng)叫做test,那么可以使用下面命令來(lái)重啟對(duì)應(yīng)的uwsgi服務(wù)
重啟test的uwsgi服務(wù):/usr/bin/supervisorctl restart test?(啟動(dòng)服務(wù)命令:/usr/bin/supervisorctl start test)
我們?cè)跒g覽器中輸入網(wǎng)址:http://192.168.0.128/index/?就可以看到使用nginx+supervisord+uwsgi+python(bottle框架)運(yùn)行的Hello World了
ps:之前使用/usr/bin/supervisorctl update重啟supervisord,可能瀏覽器訪問(wèn)時(shí)出現(xiàn)502 Bad Gateway,這時(shí)我們需要查看supervisord和uwsgi日志,看看日志里有什么錯(cuò)誤提示。一般會(huì)有下面日志:
日志路徑可以查看前面/etc/supervisord.conf 和?/etc/uwsgi/test.xml 配置文件里設(shè)置的路徑,如果是nginx的日志則查看 /usr/local/nginx/conf/vhost/ 下面各個(gè)conf配置文件里設(shè)置的路徑,用cat命令就可以查看到日志內(nèi)容了,如果日志內(nèi)容非常多,可以使用tail -f xxx.log命令來(lái)實(shí)時(shí)查看。
***?Starting?uWSGI?2.0.14?(64bit)?on?[Thu?Mar?30?03:44:31?2017]?*** compiled?with?version:?4.8.5?20150623?(Red?Hat?4.8.5-11)?on?29?March?2017?23:46:25 os:?Linux-3.10.0-514.el7.x86_64?#1?SMP?Tue?Nov?22?16:42:41?UTC?2016 nodename:?localhost.localdomain machine:?x86_64 clock?source:?unix pcre?jit?disabled detected?number?of?CPU?cores:?16 current?working?directory:?/data/www/test detected?binary?path:?/usr/local/bin/uwsgi uWSGI?running?as?root,?you?can?use?--uid/--gid/--chroot?options ***?WARNING:?you?are?running?uWSGI?as?root?!!!?(use?the?--uid?flag)?***? chdir()?to?/data/www/test/ your?processes?number?limit?is?62479 limiting?address?space?of?processes... your?process?address?space?limit?is?536870912?bytes?(512?MB) your?memory?page?size?is?4096?bytes detected?max?file?descriptor?number:?1024 lock?engine:?pthread?robust?mutexes thunder?lock:?disabled?(you?can?enable?it?with?--thunder-lock) probably?another?instance?of?uWSGI?is?running?on?the?same?address?(127.0.0.1:8088). bind():?Address?already?in?use?[core/socket.c?line?769]
我們可以輸入命令:ps -ef | grep uwsgi,查看一下uwsgi有沒(méi)有運(yùn)行,如果沒(méi)有運(yùn)行的話,可執(zhí)行:/usr/bin/supervisorctl reload,再使用ps命令檢查一下uwsgi啟動(dòng)了沒(méi)有,啟動(dòng)了就表示正常了
六、使用svn來(lái)管理python的自動(dòng)化發(fā)布
創(chuàng)建svn管理目錄:mkdir /data/svn
進(jìn)入svn管理目錄:cd /data/svn
創(chuàng)建svn項(xiàng):svnadmin create test
修改/data/svn/test/conf文件夾下的配置文件
可以將這三個(gè)文件下載下來(lái)進(jìn)行修改,也可以用vi進(jìn)行編輯
將authz文件替換成下面內(nèi)容:
[test:/] admin?=?rw allempty?=?rw
test是svn當(dāng)前倉(cāng)庫(kù)項(xiàng)的模塊名稱(chēng),每個(gè)svn的這個(gè)名稱(chēng)都是唯一的,不然可能無(wú)法登錄使用
添加添加了兩個(gè)賬號(hào),admin用于服務(wù)器端自動(dòng)同步svn的代碼到對(duì)應(yīng)的web或服務(wù)使用,和個(gè)人賬號(hào)區(qū)別出來(lái),方便管理和保護(hù)賬號(hào)安全,而allempty是我自己添加用于svn更新最新代碼的賬號(hào)
將password文件替換成下面內(nèi)容:
[users] admin?=?123456allempty?=?123456
這里設(shè)置賬號(hào)對(duì)應(yīng)的密碼
將svnserve.conf文件替換成下面內(nèi)容:
[general] anon-access?=?none auth-access?=?writepassword-db?=?passwdauthz-db?=?authz
在/data/svn/test/hooks/目錄下創(chuàng)建post-commit勾子文件(post-commit文件沒(méi)有擴(kuò)展名),用于svn更新成功以后,自動(dòng)同步到對(duì)應(yīng)的代碼目錄
#!/bin/sh export.UTF-8 /usr/bin/svn?up?/data/www/test /usr/bin/supervisorctl?restart?test
/usr/bin/svn up /data/www/test?這個(gè)命令是運(yùn)行更新指令,本地代碼通過(guò)svn更新到服務(wù)器以后,勾子會(huì)運(yùn)行它來(lái)同步到指定的/data/www/test目錄
/usr/bin/supervisorctl restart test?因?yàn)槲覀冇玫氖莝upervisord來(lái)管理python web服務(wù)的,代碼更新完成以后并未生效,需要重新服務(wù)才行,這個(gè)命令是用來(lái)重啟指定的supervisord進(jìn)程的,它們幫我們將對(duì)應(yīng)的uwsgi進(jìn)程進(jìn)行重啟操作
運(yùn)行命令,將給予勾子post-commit可執(zhí)行權(quán)限:chmod +x /data/svn/test/hooks/post-commit
啟動(dòng)svn服務(wù):/usr/bin/svnserve -d -r /data/svn
配置test項(xiàng)目服務(wù)器端svn同步設(shè)置
輸入命令:svn checkout svn://localhost/test /data/www/test?(在服務(wù)器端對(duì)test項(xiàng)進(jìn)行svn檢出操作)
PS:出現(xiàn)Password for 'root': 直接回車(chē)就可以了,Username:輸入前面authz里設(shè)置的賬戶(hù)名稱(chēng),Password for 'admin': 輸入對(duì)應(yīng)的密碼
操作到這里,svn的自動(dòng)化發(fā)布就完成了,我們只需要在本地檢出svn項(xiàng),然后更新代碼后,服務(wù)器端就會(huì)自動(dòng)將代碼同步到/data/www/test目錄下面,并重啟對(duì)應(yīng)的supervisord服務(wù)了
本地操作截圖:(可以下載TortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi進(jìn)行使用)
七、設(shè)置各服務(wù)開(kāi)機(jī)啟動(dòng)功能
以上眾多的服務(wù),有的朋友喜歡將它們?cè)O(shè)置成service方式自動(dòng)啟動(dòng),也有喜歡用命令方式來(lái)啟動(dòng)它們,為了操作簡(jiǎn)單,我們將它們都統(tǒng)一設(shè)置為命令啟動(dòng)方式。
輸入命令:?vi /etc/rc.local?,在內(nèi)容后面添加下面命令項(xiàng),然后保存退出
ulimit?-SHn?102400 /usr/bin/python2.7?/usr/bin/supervisord /usr/local/nginx/sbin/nginx /usr/bin/svnserve?-d?-r?/data/svn su?postgres?-c?"/usr/pgsql-9.6/bin/pg_ctl?start?-D?/data/pg/data" /usr/local/redis/bin/redis-server?/usr/local/redis/redis.conf
給予rc.local可執(zhí)行權(quán)限:chmod +x /etc/rc.d/rc.local
然后重啟服務(wù)器,我們使用ps -ef就可以查看到各服務(wù)正在運(yùn)行中了
python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。