文章目录
一、本地环境基本介绍
二、yum升级命令说明
三、升级好nginx后如何不中断业务切换
3.1、nginx相关的信号说明
3.2、在线热升级nginx可执行文件程序
一、本地环境基本介绍
本次测试环境,是通过nginx早期提供的yum仓库安装的nginx。所以准确来说,算是官方提供的rpm包来安装的,安装文件目录层级结构:

[root@node1 nginx]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.14.0
/usr/share/doc/nginx-1.14.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx

[root@node1 nginx]# rpm -qa|grep nginx
nginx-1.14.0-1.el7_4.ngx.x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
二、yum升级命令说明
(1) 检测nginx是否有可用更新包

[root@node1 ~]# yum check nginx
Loaded plugins: fastestmirror
check ['nginx']
[root@node1 ~]# yum check-update
[root@node1 ~]# yum check-update nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* epel: mirrors.aliyun.com
* extras: mirrors.shu.edu.cn
* updates: mirrors.shu.edu.cn

nginx.x86_64 1:1.14.1-1.el7_4.ngx nginx
[root@node1 ~]#

[root@node1 ~]# yum list updates nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* epel: mirrors.aliyun.com
* extras: mirrors.shu.edu.cn
* updates: mirrors.shu.edu.cn
Updated Packages
nginx.x86_64 1:1.14.1-1.el7_4.ngx nginx
[root@node1 ~]#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(2) 如何通过yum更新nginx

#检测到有可用更新后,并且做过调查,就可以尝试更新(生产环境不建议用最新),可以参考epel源最新版本
yum update nginx
1
2
三、升级好nginx后如何不中断业务切换
官网关于nginx信号控制说明:http://nginx.org/en/docs/control.html

3.1、nginx相关的信号说明
nginx的管理进程(master process)可以接受指定的几种系统信号:

SIGINT, SIGTERM
Shut down quickly.
快速关闭;
SIGHUP
Reload configuration, start the new worker process with a new configuration, and gracefully shut down old worker processes.
重载配置,新启动的工作进程是重读配置后的,然后旧的工作进程会平滑关闭,等待其处理完旧的连接会话后;
SIGQUIT
Shut down gracefully.
平滑的关闭;
SIGUSR1
Reopen log files.
重新打开日志文件;
SIGUSR2
Upgrade the nginx executable on the fly.
在线升级nginx执行程序文件;
SIGWINCH
Shut down worker processes gracefully.
平滑关闭工作进程;
实际使用:
上边是系统信号名称,如果用配合nginx使用,使用形式为kill -SIGNAL `cat /path/to/pidfile`
可用SIGNAL有:

(1) TERM, INT
fast shutdown.
快速关闭,不安全退出,强杀;
对应于系统信号:
SIGINT, SIGTERM
等价于kill -9,非特殊情况不建议使用;

(2) QUIT
graceful shutdown。
平滑关闭。
对应于系统信号:SIGQUIT
已经建立连接的请求会处理完毕后退出;

(3) HUP
changing configuration, keeping up with a changed time zone (only for FreeBSD and Linux), starting new worker processes with a new configuration, graceful shutdown of old worker processes。
重载配置;
对应于系统信号:SIGHUP

(4) USR1
re-opening log files
重读日志文件。
对应于系统信号:SIGUSR1

(5) USR2
upgrading an executable file。
升级可执行文件。
对应于系统信号:SIGUSR2

(6) WINCH
graceful shutdown of worker processes
平滑关闭nginx工作进程。
对应于系统信号:SIGWINCH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
nginx的工作进程(worker process)可以接受指定的几种系统信号:

SIGTERM
Shut down quickly.
快速关闭;
SIGQUIT
Shut down gracefully.
平滑关闭;
SIGUSR1
Reopen log files.
重新打开日志文件;
实际使用:
上边是系统信号名称,如果用配合nginx使用,使用形式为kill -SIGNAL worker_pid
可用SIGNAL有(实际不需要手动对工作进程操作,因为工作进程是由管理进程来管理的):

(1) TERM, INT
fast shutdown
快速关闭。
先找到工作进程的pid,然后kill -TERM pid或kill -INT pid,这个是强制退出;

(2) QUIT
graceful shutdown
平滑关闭,操作方式同TERM或INT。

(3) USR1
re-opening log files
重新打开日志文件。

(4) WINCH
abnormal termination for debugging (requires debug_points to be enabled)
调试异常终止(需要启用debug_points)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nginx二进制程序可以通过-s 选项传递给nginx对应的参数,表示给nginx管理进程发送对应的信号。标准形式:

-s signal
其中signal可以为stop,quit,reopen,reload;
1
2
stop:SIGTERM(快速关闭);
quit:SIGQUIT(平滑关闭);
reopen:SIGUSR1(重新打开日志文件);
reload:SIGHUP(重载配置,新启动的工作进程是重读配置后的,然后旧的工作进程会平滑关闭,等待其处理完旧的连接会话后);

3.2、在线热升级nginx可执行文件程序
理论说明
(1) 用新的nginx二进制程序文件替换旧的二进制程序文件;替换前建议先备份旧的二进制文件。
替换的方式,如果是源码包编译安装,可以直接cp替换或者其他方式替换。如果是rpm包或者yum直接更新升级,建议先用cp等工具备份一下旧的二进制程序文件;
(2) 向nginx的管理进程发送USR2信号
管理进程会把旧的pid文件备份成类似于nginx.pid.oldbin的形式。然后启用一个新的管理进程,并且创建了对应的pid文件,新的管理进程会去启动新的工作进程。此时,应该存在新旧两个管理进程以及新旧管理进程启动的工作进程,新旧工作进程此时会继续接收处理请求;
(3) 向旧的管理进程发送WINCH信号
旧的管理进程会向旧的工作进程发送消息,请求平滑关闭它们,然后旧的工作进程将不再接受新的请求,如果正在处理旧的请求的要等处理完成后自动关闭,没有在处理的旧的工作进程会直接退出。
(4) 过一段时间后,通过工具确认没有旧的工作进程在处理请求后,只剩下新旧管理进程和新的工作进程。
默认,旧的管理进程不会关闭它监听的套接字,如果后续有需要,它可以重新再管理他自己的工作进程,以便回滚处理连接请求。如果刚好由于某些原因,升级二进制程序不成功,要回滚的。
比如因为一些原因,新的执行文件不工作,要按照以下步骤回滚:
a) 向旧的管理进程发送HUB信号
信号接收后,旧的工作进程将会重新开启工作进程(不会重读加载配置)。此时,旧的工作进程开始工作后,要向之前新的管理进程发送QUIT信号,以便之前新的管理进程通过它之前管理的工作进程,让它们平滑关闭。
b) 发送TERM信号给新的工作进程。
它会向它的工作进程发送消息让它们立即退出,它们受到消息后会立即离开。如果进程由于某些原因不理解退出,KILL信号将会发送给它们迫使他们去退出。一旦新的工作管理进程退出后,旧的管理进程将会自动开启新的工作进程。
新的工作进程退出后,旧的工作进程会被nginx.pid.oldbin后缀给去掉。
如果升级成功,应该发送QUIT信号给旧的管理进程。

实际操作
(1) 备份nginx二进制程序文件
[root@node1 ~]# mv /usr/sbin/nginx{,.bak}
[root@node1 ~]# ls -l /usr/sbin/nginx
ls: cannot access /usr/sbin/nginx: No such file or directory
[root@node1 ~]# ls -l /usr/sbin/nginx.bak
-rwxr-xr-x 1 root root 1307560 Apr 17 2018 /usr/sbin/nginx.bak
[root@node1 ~]# ps uax|grep nginx
root 2113 0.0 0.3 46428 1724 ? Ss 16:22 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 2183 0.0 0.3 46828 1860 ? S 16:36 0:00 nginx: worker process
nginx 2184 0.0 0.3 46828 1856 ? S 16:36 0:00 nginx: worker process
root 2584 0.0 0.1 112640 960 pts/2 S+ 17:44 0:00 grep --color=auto nginx
#这里不用担心由于二进制程备份导致处理连接连接请求失败,因为nginx的进程已经启动,二进制程序已经
读取到内存中去了。
#如果/usr/sbin/nginx-debug有用,最好也备份一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
(2) yum升级nginx

[root@node1 ~]# yum update nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* epel: mirrors.aliyun.com
* extras: mirrors.shu.edu.cn
* updates: mirrors.shu.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.14.0-1.el7_4.ngx will be updated
---> Package nginx.x86_64 1:1.14.1-1.el7_4.ngx will be an update
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================================================================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================================================================================================================
Updating:
nginx x86_64 1:1.14.1-1.el7_4.ngx nginx 753 k

Transaction Summary
============================================================================================================================================================================================================================================
Upgrade 1 Package

Total download size: 753 k
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for nginx
nginx-1.14.1-1.el7_4.ngx.x86_64.rpm | 753 kB 00:00:24
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : 1:nginx-1.14.1-1.el7_4.ngx.x86_64 1/2
Cleanup : 1:nginx-1.14.0-1.el7_4.ngx.x86_64 2/2
Verifying : 1:nginx-1.14.1-1.el7_4.ngx.x86_64 1/2
Verifying : 1:nginx-1.14.0-1.el7_4.ngx.x86_64 2/2

Updated:
nginx.x86_64 1:1.14.1-1.el7_4.ngx

Complete!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
此时nginx二进制程序为新的二进制程序了。

[root@node1 ~]# which nginx
/usr/sbin/nginx
[root@node1 ~]# ls -l /usr/sbin/nginx
-rwxr-xr-x 1 root root 1307696 Nov 6 22:04 /usr/sbin/nginx
[root@node1 ~]# /usr/sbin/nginx -v
nginx version: nginx/1.14.1
1
2
3
4
5
6
(3) 向nginx的管理进程发送USR2信号

[root@node1 ~]# ls -l /var/run/nginx.pid
-rw-r--r-- 1 root root 5 Nov 19 17:46 /var/run/nginx.pid
[root@node1 ~]# ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
PID PPID USER %CPU VSZ WCHAN COMMAND
2656 1 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2658 2656 nginx 0.0 46708 ep_pol nginx: worker process
2659 2656 nginx 0.0 46708 sleep_ nginx: worker process
2685 2201 root 0.0 107888 inotif tailf /var/log/nginx/access.log
2695 2387 root 0.0 112644 pipe_w grep -E --color=auto (nginx|PID)
[root@node1 ~]# cat /var/run/nginx.pid
2656
[root@node1 ~]# kill -USR2 `cat /var/run/nginx.pid`
[root@node1 ~]# ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
PID PPID USER %CPU VSZ WCHAN COMMAND
2656 1 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2658 2656 nginx 0.0 46708 ep_pol nginx: worker process
2659 2656 nginx 0.0 46708 ep_pol nginx: worker process
2685 2201 root 0.0 107888 inotif tailf /var/log/nginx/access.log
2698 2656 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2699 2698 nginx 0.0 46708 ep_pol nginx: worker process
2700 2698 nginx 0.0 46708 ep_pol nginx: worker process
2702 2387 root 0.0 112644 - grep -E --color=auto (nginx|PID)
[root@node1 ~]# ls -l /var/run/nginx.pid*
-rw-r--r-- 1 root root 5 Nov 19 17:53 /var/run/nginx.pid
-rw-r--r-- 1 root root 5 Nov 19 17:46 /var/run/nginx.pid.oldbin
[root@node1 ~]# cat /var/run/nginx.pid
2698
[root@node1 ~]# cat /var/run/nginx.pid.oldbin
2656

(4) 测试发信升级后,可以接受新的连接后。向旧的管理进程发送WINCH信号

#新连接请求,我就不截图了,大概看一下业务没有问题。能接受新请求,就可以开始下一步
[root@node1 ~]# kill -WINCH `cat /var/run/nginx.pid.oldbin`
[root@node1 ~]# ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
PID PPID USER %CPU VSZ WCHAN COMMAND
2656 1 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2685 2201 root 0.0 107888 inotif tailf /var/log/nginx/access.log
2698 2656 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2699 2698 nginx 0.0 46708 ep_pol nginx: worker process
2700 2698 nginx 0.0 46708 ep_pol nginx: worker process
2719 2387 root 0.0 112644 pipe_w grep -E --color=auto (nginx|PID)
1
2
3
4
5
6
7
8
9
10
(5) 确认旧的工作进程没有都平滑退出后,可以看看升级是否成功。如果可以,直接向旧的
管理进程发送QUIT信号

[root@node1 ~]# ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
PID PPID USER %CPU VSZ WCHAN COMMAND
2656 1 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2698 2656 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2699 2698 nginx 0.0 46708 ep_pol nginx: worker process
2700 2698 nginx 0.0 46708 ep_pol nginx: worker process
2724 2387 root 0.0 112644 pipe_w grep -E --color=auto (nginx|PID)
#上边已经没有旧的工作进程在处理旧的请求了
[root@node1 ~]# kill -QUIT `cat /var/run/nginx.pid.oldbin`
[root@node1 ~]# ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
PID PPID USER %CPU VSZ WCHAN COMMAND
2698 1 root 0.0 46304 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2699 2698 nginx 0.0 46708 ep_pol nginx: worker process
2700 2698 nginx 0.0 46708 ep_pol nginx: worker process
2733 2387 root 0.0 112644 pipe_w grep -E --color=auto (nginx|PID)
[root@node1 ~]# ls -l /var/run/nginx.pid
-rw-r--r-- 1 root root 5 Nov 19 17:53 /var/run/nginx.pid
[root@node1 ~]# ls -l /var/run/nginx.pid*
-rw-r--r-- 1 root root 5 Nov 19 17:53 /var/run/nginx.pid
#为了确认无误,可以重载一下配置:
[root@node1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@node1 ~]# nginx -s reload
[root@node1 ~]# ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
PID PPID USER %CPU VSZ WCHAN COMMAND
2698 1 root 0.0 46436 sigsus nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
2738 2698 nginx 0.0 46840 ep_pol nginx: worker process
2739 2698 nginx 0.0 46840 ep_pol nginx: worker process
2741 2387 root 0.0 112644 pipe_w grep -E --color=auto (nginx|PID)

申明:本测试是基于测试环境完成,如果有需要做类似的操作,生产环境操作请慎重。因为nginx的可执行程序热升级,可能会导致其他问题(鉴于学术有限,这里没法列出)。

[root@node39 SPECS]# cat nginx.spec
Name: nginx
Version: 1.10.3
Release: 1%{?dist}
Summary: nginx rmp package production
Group: Applications/Archiving
License: GPLv2
URL: http://www.nginx.org
Source: http://nginx.org/download/nginx-%{version}.tar.gz
Source1: nginx.service
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: gcc
Requires: openssl,openssl-devel,pcre-devel,pcre
%description
Custom nginx rpm package

%prep
rm -rf $RPM_BUILD_DIR/nginx-%{version}
tar xf $RPM_SOURCE_DIR/nginx-%{version}.tar.gz

%build
cd nginx-%{version}
./configure \
--user=www \
--group=www \
--prefix=/home/application/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module
make %{?_smp_mflags}

%install
rm -rf %{buildroot}
cd nginx-%{version}
make install DESTDIR=%{buildroot}
%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/usr/lib/systemd/system/nginx.service

%pre
getent group www >/dev/null || \
groupadd -r www
getent passwd www >/dev/null || \
useradd -r -g www -M \
-s /sbin/nologin -c "nginx" www
exit 0

%post
if [ $1 == 1 ];then
/usr/bin/systemctl start nginx
fi

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
/home/application/nginx
%attr(0644,root,root) /usr/lib/systemd/system/nginx.service
%config(noreplace) /home/application/nginx/conf/*

%preun
if [ $1 == 0 ];then
/usr/bin/systemctl stop nginx > /dev/null 2>&1
/usr/sbin/userdel -r www 2> /dev/null

fi

%postun
if [ $1 == 0 ];then
/usr/bin/rm -rf /home/application/nginx
/usr/bin/rm -rf /usr/lib/systemd/system/nginx.service
fi

[root@node40 SPECS]# cat tengine.spec
Name: tengine
Version: 2.2.1
Release: 1%{?dist}
Summary: tengine rmp package production
Group: Applications/Archiving
License: GPLv2
URL: http://tengine.taobao.org/
Source0: %{name}-%{version}.tar.gz
Source1: nginx.conf
Source2: nginx.service
Source3: upstream.conf
Source4: server.conf
Source5: ngx_cache_purge-2.3.tar.gz
Source6: ngx_http_redis-0.3.8.tar.gz
Source7: LuaJIT-2.1.0-beta1
Source8: pcre-8.34.tar.gz
Source9: libmd5-0.8.2b.tar.gz
Source10: openssl-1.0.2p.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: openssl-devel openssl zlib-devel gcc gcc-c++ make cmake
Requires: openssl-devel openssl zlib-devel gcc gcc-c++ make cmake
%description
Custom tengine rpm package

%prep
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
%setup -q -b 0 -b 5 -b 6 -b 8 -b 9 -b 10

%build
./configure --prefix=/usr/local/services/tengine-2.2.1 \
--user=www --group=www --with-http_ssl_module --with-http_lua_module \
--with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
--with-sha1=/usr --with-openssl=../openssl-1.0.2p --with-md5=../md5 \
--with-pcre=../pcre-8.34 --with-luajit-inc=/usr/local/services/include/luajit-2.1 \
--with-luajit-lib=/usr/local/services/lib --without-select_module --without-poll_module \
--without-http_userid_module --without-mail_pop3_module --without-mail_imap_module \
--without-mail_smtp_module --add-module=../ngx_cache_purge-2.3 \
--add-module=../ngx_http_redis-0.3.8 --with-http_v2_module

make %{?_smp_mflags}

%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%{__install} -p -D -m 0644 %{SOURCE1} %{buildroot}/usr/local/services/tengine-2.2.1/conf/nginx.conf
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/usr/lib/systemd/system/nginx.service
%{__install} -p -D -m 0755 %{SOURCE3} %{buildroot}/usr/local/services/tengine-2.2.1/conf/.upstream/www.default.com.conf
%{__install} -p -D -m 0644 %{SOURCE4} %{buildroot}/usr/local/services/tengine-2.2.1/conf/sites-enabled/www.default.com.conf
/usr/bin/cp -a %{SOURCE7} %{buildroot}/usr/local/services/
pwd

%pre
getent group www >/dev/null || \
groupadd -r www
getent passwd www >/dev/null || \
useradd -r -g www -M \
-s /sbin/nologin -c "nginx" www
exit 0

%post
if [ $1 == 1 ];then
ln -s /usr/local/services/tengine-2.2.1 /usr/local/services/tengine
mkdir -p /usr/local/services/tengine/conf/{sites-{enabled,available},.ssl,.upstream}
mkdir -p /usr/local/services/tengine/temp/client_body
cd /usr/local/services/LuaJIT-2.1.0-beta1
make && make install
echo "/usr/local/services/lib" >/etc/ld.so.conf.d/services_lib.conf
ldconfig
/bin/systemctl start nginx
fi

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
/usr/local/services
%attr(0644,root,root) /usr/lib/systemd/system/nginx.service

%preun
if [ $1 == 0 ];then
/bin/systemctl stop nginx > /dev/null 2>&1
/usr/sbin/userdel -r www 2> /dev/null
fi

%postun
if [ $1 == 0 ];then
/usr/bin/rm -rf /usr/local/services/tengine*
/usr/bin/rm -rf /usr/lib/systemd/system/nginx.service
fi
[root@node40 SPECS]#

rpm包安装的nginx热升级的更多相关文章

  1. [Linux系统] (3)应用安装方式详解(编译安装、rpm包安装、yum安装)

    软件的安装方式: 编译安装 RPM包安装 yum安装 一.编译安装 1.下载一个源码安装包:tengine-2.3.0.tar.gz.这是淘宝二次开发过的nginx.将其解压. .tar.gz 2.查 ...

  2. rpm包安装过程中依赖问题“libc.so.6 is needed by XXX”解决方法

    rpm包安装过程中依赖问题"libc.so.6 is needed by XXX"解决方法 折腾了几天,终于搞定了CentOS上的Canon LBP2900打印机驱动.中间遇到了一 ...

  3. linux下rpm包安装、配置和卸载mysql

    WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/redhat- ...

  4. yum --rpm包安装

    rpm -ivh  package -i 表示安装install -v表示显示详细信息, -vv更详细些 -h表示显示安装进度 --force:表示强制安装 --nodeps:忽略依赖关系安装 --r ...

  5. 注意:rsyslog 源码安装 会出现日志重复发的情况,需要rpm包安装

    cd /etc/yum.repos.d;wget http://rpms.adiscon.com/v8-stable/rsyslog.repo uat-web02:/etc/yum.repos.d# ...

  6. rpm包安装

    RPM全称是“RedHatPackageManager”是由RedHat公司发发展起来的,本质是将软件源码包经过编译并且打包成rpm的格式,rpm文件包含的有二进制文件,配置文件,库文件等,同时RPM ...

  7. ubuntu rpm 包安装使用

    ubuntu安装rpm的方法RED HAT系列用rpm包安装软件,Debian系列得用deb包.毕竟red hat历史悠久,有很多rpm软件包还未对应deb格式.(对应的地方现在是越来越多)在网上找了 ...

  8. 包管理 ----- Linux操作系统rpm包安装方式步骤

    Linux操作系统rpm包安装方式步骤 2016年08月04日 07:00:26 阅读数:17140 转自 : http://os.51cto.com/art/201003/186467.htm 特别 ...

  9. 二级制包安装Tomcat 与 RPM包安装Tomcat

    1:下载二级制包 wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.g ...

随机推荐

  1. How Region Split works in Hbase

    A region is decided to be split when store file size goes above hbase.hregion.max.filesize or accord ...

  2. jquery移除元素时会自动解绑事件

    .html() When .html() is used to set an element's content, any content that was in that element is co ...

  3. 【转】matlab学习(5) 读取excel文件

    转自:https://blog.csdn.net/thy19988/article/details/78489623 1.使用函数xlsread读取单个文件(1)num=xlsread(filenam ...

  4. POJ1821 Fence

    题意 Language:Default Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6478 Accepted: ...

  5. 集合总结一(ArrayList的实现原理)

    一.概述 一上来,先来看看源码中的这一段注释,我们可以从中提取到一些关键信息: Resizable-array implementation of the List interface. Implem ...

  6. 第二章 JavaScript文档(上)

    JavaScript 1.JavaScript简介 起源 在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成.Netscape在最初将其脚本语言命名 ...

  7. keepalived 高可用配置

    下载地址:http://www.keepalived.org/software/keepalived-1.2.12.tar.gzht 安装方法:1. ./configure 可能出现的错误 !!! O ...

  8. Maya中输出alembic文件的方法

    Maya中输出alembic文件是有现成api调用的,与maya中大部分api一样,这个功能参数的传入是非常类似mel的,本质上讲都是kwargs类型的参数,所以我们传入的参数就需要整理成类似于mel ...

  9. Python3 字典 setdefault() 方法

    Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值. dict.setdefault(key, default=None) k ...

  10. svn安装和使用

    https://www.cnblogs.com/webStyle/p/3696003.html