python服務(wù)器環(huán)境搭建(3)——參數(shù)配置

      網(wǎng)友投稿 1114 2022-05-29

      前面我們已安裝好了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)容如下:

      ????python35 ????127.0.0.1:8088 ????/data/www/test ????2048 ????512 ????128 ????96 ????8 ????2000 ????????6 ????????6 ????????20 ????/data/www/test ????/data/logs/uwsgi/test_uwsgi.log ???? ???????? ???? ???? ????

      修改/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

      python服務(wù)器環(huán)境搭建(3)——參數(shù)配置

      然后重啟服務(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)容。

      上一篇:測(cè)試面試題集錦(三)| 計(jì)算機(jī)網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)篇(附答案)
      下一篇:云合同電子簽約:在線電子合同簽署服務(wù)具體適用于哪些行業(yè)領(lǐng)域?
      相關(guān)文章
      亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲AV成人无码网站| 亚洲国产精久久久久久久| 亚洲中文字幕无码一久久区| 亚洲人成网站在线观看青青| 亚洲?V乱码久久精品蜜桃 | 亚洲中文字幕一二三四区| 亚洲AV无码专区在线亚| 亚洲综合久久久久久中文字幕| 亚洲天天在线日亚洲洲精| 婷婷精品国产亚洲AV麻豆不片| 亚洲不卡av不卡一区二区| 精品亚洲永久免费精品| 亚洲国产精品无码久久一区二区 | 2020天堂在线亚洲精品专区| 亚洲日本人成中文字幕| 国产精品亚洲自在线播放页码| 色在线亚洲视频www| 亚洲午夜精品一区二区麻豆| 亚洲一本一道一区二区三区| 国产成人精品日本亚洲11| 亚洲综合精品第一页| 亚洲精品乱码久久久久蜜桃| 亚洲av无码专区在线观看下载| 国产精品无码亚洲一区二区三区| 国产综合激情在线亚洲第一页 | 久久精品国产亚洲AV麻豆王友容| 久久亚洲AV午夜福利精品一区| 久久久影院亚洲精品| 1区1区3区4区产品亚洲| 亚洲精品中文字幕乱码影院| 亚洲噜噜噜噜噜影院在线播放| 国产色在线|亚洲| 在线视频亚洲一区| 亚洲国产午夜福利在线播放| 中文字幕亚洲不卡在线亚瑟| 国产亚洲免费的视频看| 亚洲国产精品久久久久久| 亚洲精品**中文毛片| 在线观看亚洲AV日韩AV| jizzjizz亚洲日本少妇|