Nginx编译安装
Linux 7为例子,前边OS的配置或者优化项比如关闭防火墙就忽略不写了。
主要写Nginx的编译安装。
官方下载网址:
一般我们都需要先装pcre, zlib,ssl,pcre为了重写rewrite,zlib为了gzip压缩,ssl 功能需要openssl库。
可以使用yum安装,想使用最新版本的pcre,zlib以及ssl可以使用源码安装。
ssl参考我另外的博客:Linux升级openssh过程
不过为了方便这里示例是使用yum进行安装的。
依赖包安装
yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel openssl-devel zlib zlib-devel openssl
配置环境变量
vi ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
source生效或者重新开启新新会话生效。
解压编译安装
tar -zxvf nginx-1.20.1.tar.gz
cd nginx-1.20.1
./configure --prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-file-aio \
--with-http_realip_module \
--with-http_ssl_module
make
make install
echo $?
[root@dm8 soft]# tar -zxvf nginx-1.20.1.tar.gz
[root@dm8 soft]# cd nginx-1.20.1
[root@dm8 nginx-1.20.1]# ./configure --prefix=/usr/local/nginx \
> --conf-path=/usr/local/nginx/conf/nginx.conf \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --with-file-aio \
> --with-http_realip_module \
> --with-http_ssl_module
[root@dm8 nginx-1.20.1]# make
[root@dm8 nginx-1.20.1]# make install
[root@dm8 nginx-1.20.1]# echo $?
依赖包都安装的话基本不会遇到问题。
另外,如果开始pcre,zlib,ssl使用源码安装,则对应的需要的依赖包和configure使用如下:
yum install -y gcc gcc-c++ make automake autoconf libtool
./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-file-aio \
--with-http_realip_module \
--with-http_ssl_module \
--with-pcre=/soft/pcre-8.45 \
--with-zlib=/soft/zlib-1.2.11 \
--with-openssl=/soft/openssl-1.1.1k
--with-pcre=/soft/pcre-8.45 指的是pcre-8.45的源码路径。
--with-zlib=/soft/zlib-1.2.11指的是zlib-1.2.11的源码路径。
--with-openssl=/soft/openssl-1.1.1k指的是openssl-1.1.1k的源码路径。
建议使用/usr/local/src/目录代替/soft。
配置开机自启
Nginx官网选择NGINX Init Scripts启动脚本,根据OS类型为RedHat/CentOS选择Red Hat NGINX Init Script。
添加nginx启动脚本
1 vi /etc/init.d/nginx
2 #!/bin/sh
3 #
4 # nginx - this script starts and stops the nginx daemon
5 #
6 # chkconfig: - 85 15
7 # description: NGINX is an HTTP(S) server, HTTP(S) reverse \
8 # proxy and IMAP/POP3 proxy server
9 # processname: nginx
10 # config: /etc/nginx/nginx.conf
11 # config: /etc/sysconfig/nginx
12 # pidfile: /usr/local/nginx/logs/nginx.pid
13
14 # Source function library.
15 . /etc/rc.d/init.d/functions
16
17 # Source networking configuration.
18 . /etc/sysconfig/network
19
20 # Check that networking is up.
21 [ "$NETWORKING" = "no" ] && exit 0
22
23 nginx="/usr/local/nginx/sbin/nginx"
24 prog=$(basename $nginx)
25
26 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
27
28 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
29
30 lockfile=/var/lock/subsys/nginx
31
32 make_dirs() {
33 # make required directories
34 user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
35 if [ -n "$user" ]; then
36 if [ -z "`grep $user /etc/passwd`" ]; then
37 useradd -M -s /bin/nologin $user
38 fi
39 options=`$nginx -V 2>&1 | grep 'configure arguments:'`
40 for opt in $options; do
41 if [ `echo $opt | grep '.*-temp-path'` ]; then
42 value=`echo $opt | cut -d "=" -f 2`
43 if [ ! -d "$value" ]; then
44 # echo "creating" $value
45 mkdir -p $value && chown -R $user $value
46 fi
47 fi
48 done
49 fi
50 }
51
52 start() {
53 [ -x $nginx ] || exit 5
54 [ -f $NGINX_CONF_FILE ] || exit 6
55 make_dirs
56 echo -n $"Starting $prog: "
57 daemon $nginx -c $NGINX_CONF_FILE
58 retval=$?
59 echo
60 [ $retval -eq 0 ] && touch $lockfile
61 return $retval
62 }
63
64 stop() {
65 echo -n $"Stopping $prog: "
66 killproc $prog -QUIT
67 retval=$?
68 echo
69 [ $retval -eq 0 ] && rm -f $lockfile
70 return $retval
71 }
72
73 restart() {
74 configtest || return $?
75 stop
76 sleep 1
77 start
78 }
79
80 reload() {
81 configtest || return $?
82 echo -n $"Reloading $prog: "
83 killproc $prog -HUP
84 retval=$?
85 echo
86 }
87
88 force_reload() {
89 restart
90 }
91
92 configtest() {
93 $nginx -t -c $NGINX_CONF_FILE
94 }
95
96 rh_status() {
97 status $prog
98 }
99
100 rh_status_q() {
101 rh_status >/dev/null 2>&1
102 }
103
104 case "$1" in
105 start)
106 rh_status_q && exit 0
107 $1
108 ;;
109 stop)
110 rh_status_q || exit 0
111 $1
112 ;;
113 restart|configtest)
114 $1
115 ;;
116 reload)
117 rh_status_q || exit 7
118 $1
119 ;;
120 force-reload)
121 force_reload
122 ;;
123 status)
124 rh_status
125 ;;
126 condrestart|try-restart)
127 rh_status_q || exit 0
128 ;;
129 *)
130 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
131 exit 2
132 esac
说明:这段脚本分别修改了第12,23,26行。
其中第12行为nginx.pid位置,虽然是#注释的,不过会影响启动时候pid的判定位置,导致卡住。
在使用service nginx start的之后会卡住并生成/run/systemd/generator.late/nginx.service文件,该文件中PIDFile的值根据这第12行的位置来生成。
比如如果不修改12行,默认是
# pidfile: /var/run/nginx.pid
此时有如下问题
[root@dm8 init.d]# service nginx start
Starting nginx (via systemctl): Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.
卡住......
使用systemctl看状态有:
[root@dm8 ~]# systemctl status nginx
● nginx.service - SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
Active: activating (start) since Fri 2021-08-27 06:17:14 EDT; 18s ago
Docs: man:systemd-sysv-generator(8)
Process: 1627 ExecStart=/etc/rc.d/init.d/nginx start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nginx.service
├─1287 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
└─1289 nginx: worker process
Aug 27 06:17:14 dm8 systemd[1]: Starting SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server...
Aug 27 06:17:14 dm8 systemd[1]: Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory
看最后一行的路径就有问题。
并且有
[root@dm8 ~]# cat /run/systemd/generator.late/nginx.service
# Automatically generated by systemd-sysv-generator
[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/nginx
Description=SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=no
PIDFile=/var/run/nginx.pid
ExecStart=/etc/rc.d/init.d/nginx start
ExecStop=/etc/rc.d/init.d/nginx stop
ExecReload=/etc/rc.d/init.d/nginx reload
授权启动脚本
chmod 755 /etc/init.d/nginx
启动Nginx并设置开机启动
确认当前Nginx没在运行。
[root@dm8 init.d]# service nginx start
Starting nginx (via systemctl): [ OK ]
此时,会有如下文件产生。
[root@dm8 conf]# ll /run/systemd/generator.late/nginx.service
-rw-r--r--. 1 root root 510 Aug 27 07:04 /run/systemd/generator.late/nginx.service
将之拷贝至如下目录。
cp /run/systemd/generator.late/nginx.service /usr/lib/systemd/system/
之后的/usr/lib/systemd/system/nginx.service内容如下(有修改)。
[root@dm8 conf]# cat /usr/lib/systemd/system/nginx.service
# Automatically generated by systemd-sysv-generator
[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/nginx
Description=SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
RemainAfterExit=no
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/etc/rc.d/init.d/nginx start
ExecStop=/etc/rc.d/init.d/nginx stop
ExecReload=/etc/rc.d/init.d/nginx reload
ExecStartPost=/bin/sleep 0.1
[Install]
WantedBy=multi-user.target
如果不添加
ExecStartPost=/bin/sleep 0.1
systemctl status nginx的话有如下问题,根据Systemd Error "systemd[1]: Failed to read PID from file /var/run/iscsid.pid: Invalid argument" (文档 ID 2335138.1)类似的情形,可以忽略:
Aug 27 03:39:43 dm8 systemd[1]: Can't open PID file /usr/local/nginx/logs/nginx.pid (yet?) after start: No such file or directory
或者
Aug 27 10:15:51 dm8 systemd[1]: Failed to parse PID from file /usr/local/nginx/logs/nginx.pid: Invalid argument
如果不添加
[Install]
WantedBy=multi-user.target
则无法被enable自启动。
另外的解决方法:Failed to parse PID from file
也可以参考官网NGINX systemd service file做修改,正常不需要。
重载且设置开机自启。
[root@dm8 ~]# systemctl daemon-reload
[root@dm8 ~]# systemctl enable nginx
[root@dm8 ~]# systemctl restart nginx
[root@dm8 ~]# systemctl status nginx
另外也可以不需要/etc/init.d/nginx脚本(兼容Linux 6),直接参考NGINX systemd service file创建配置nginx.server。
参考链接
https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/
https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/
https://www.kancloud.cn/tinywan/nginx_tutorial/753832
https://www.cnblogs.com/skynet/p/4146083.html
Systemd Error "systemd[1]: Failed to read PID from file /var/run/iscsid.pid: Invalid argument" (文档 ID 2335138.1)