rpm包安装的nginx热升级
文章目录
一、本地环境基本介绍
二、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热升级的更多相关文章
- [Linux系统] (3)应用安装方式详解(编译安装、rpm包安装、yum安装)
软件的安装方式: 编译安装 RPM包安装 yum安装 一.编译安装 1.下载一个源码安装包:tengine-2.3.0.tar.gz.这是淘宝二次开发过的nginx.将其解压. .tar.gz 2.查 ...
- rpm包安装过程中依赖问题“libc.so.6 is needed by XXX”解决方法
rpm包安装过程中依赖问题"libc.so.6 is needed by XXX"解决方法 折腾了几天,终于搞定了CentOS上的Canon LBP2900打印机驱动.中间遇到了一 ...
- linux下rpm包安装、配置和卸载mysql
WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/redhat- ...
- yum --rpm包安装
rpm -ivh package -i 表示安装install -v表示显示详细信息, -vv更详细些 -h表示显示安装进度 --force:表示强制安装 --nodeps:忽略依赖关系安装 --r ...
- 注意:rsyslog 源码安装 会出现日志重复发的情况,需要rpm包安装
cd /etc/yum.repos.d;wget http://rpms.adiscon.com/v8-stable/rsyslog.repo uat-web02:/etc/yum.repos.d# ...
- rpm包安装
RPM全称是“RedHatPackageManager”是由RedHat公司发发展起来的,本质是将软件源码包经过编译并且打包成rpm的格式,rpm文件包含的有二进制文件,配置文件,库文件等,同时RPM ...
- ubuntu rpm 包安装使用
ubuntu安装rpm的方法RED HAT系列用rpm包安装软件,Debian系列得用deb包.毕竟red hat历史悠久,有很多rpm软件包还未对应deb格式.(对应的地方现在是越来越多)在网上找了 ...
- 包管理 ----- Linux操作系统rpm包安装方式步骤
Linux操作系统rpm包安装方式步骤 2016年08月04日 07:00:26 阅读数:17140 转自 : http://os.51cto.com/art/201003/186467.htm 特别 ...
- 二级制包安装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 ...
随机推荐
- 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 ...
- jquery移除元素时会自动解绑事件
.html() When .html() is used to set an element's content, any content that was in that element is co ...
- 【转】matlab学习(5) 读取excel文件
转自:https://blog.csdn.net/thy19988/article/details/78489623 1.使用函数xlsread读取单个文件(1)num=xlsread(filenam ...
- POJ1821 Fence
题意 Language:Default Fence Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6478 Accepted: ...
- 集合总结一(ArrayList的实现原理)
一.概述 一上来,先来看看源码中的这一段注释,我们可以从中提取到一些关键信息: Resizable-array implementation of the List interface. Implem ...
- 第二章 JavaScript文档(上)
JavaScript 1.JavaScript简介 起源 在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成.Netscape在最初将其脚本语言命名 ...
- keepalived 高可用配置
下载地址:http://www.keepalived.org/software/keepalived-1.2.12.tar.gzht 安装方法:1. ./configure 可能出现的错误 !!! O ...
- Maya中输出alembic文件的方法
Maya中输出alembic文件是有现成api调用的,与maya中大部分api一样,这个功能参数的传入是非常类似mel的,本质上讲都是kwargs类型的参数,所以我们传入的参数就需要整理成类似于mel ...
- Python3 字典 setdefault() 方法
Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值. dict.setdefault(key, default=None) k ...
- svn安装和使用
https://www.cnblogs.com/webStyle/p/3696003.html