在Linux上编译安装Nginx

实验环境

  • 操作系统:内核为Linux 2.6及以上的CentOS/Ubuntu系统;
  • 系统架构:64位
  • 推荐使用:CentOS-7系统;

相关网址

安装指导

概要

  • 安装Nginx前,有一些依赖库需要下载,分别是PCREzlib以及OpenSSL,另外值得注意的是这3个库仅需下载并解压缩即可,无需编译安装;
  • 将软件包下载完后,使用远程FTP工具(Xftp 5)将软件包上传至服务器;

查看内核版本

1
uname -a

安装编译依赖环境

Ubuntu系统

1
apt install -y build-essential libtool

CentOS系统

1
yum install -y bzip2 gcc gcc-c++ make libxslt-devel gd-devel geoip-devel

下载并解压软件包

  • 解压PCRE
1
2
3
4
PCRE_VERSION="8.42"
wget https://ftp.pcre.org/pub/pcre/pcre-${PCRE_VERSION}.tar.bz2
tar -jxf pcre-${PCRE_VERSION}.tar.bz2 -C /usr/src/
rm -f pcre-${PCRE_VERSION}.tar.bz2
  • 解压zlib
1
2
3
4
ZLIB_VERSION="1.2.11"
wget http://www.zlib.net/zlib-${ZLIB_VERSION}.tar.gz
tar -zxf zlib-${ZLIB_VERSION}.tar.gz -C /usr/src/
rm -f zlib-${ZLIB_VERSION}.tar.gz
  • 解压OpenSSL
1
2
3
4
OPENSSL_VERSION="1.1.0i"
wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
tar -zxf openssl-${OPENSSL_VERSION}.tar.gz -C /usr/src/
rm -f openssl-${OPENSSL_VERSION}.tar.gz
  • 解压nginx
1
2
3
4
NGINX_VERSION="1.14.0"
wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
tar -zxf nginx-${NGINX_VERSION}.tar.gz -C /usr/src/
rm -f nginx-${NGINX_VERSION}.tar.gz
  • 优化索引目录(可忽略):
1
2
3
4
FANCY_VERSION="0.4.3"
wget https://github.com/aperezdc/ngx-fancyindex/archive/v${FANCY_VERSION}.tar.gz -O ngx-fancyindex-${FANCY_VERSION}.tar.gz
tar -zxf ngx-fancyindex-${FANCY_VERSION}.tar.gz -C /usr/src/
rm -f ngx-fancyindex-${FANCY_VERSION}.tar.gz

添加nginx用户及用户组

1
groupadd -r nginx && useradd -r -g nginx -s /sbin/nologin nginx

预编译

  • 切换目录:
1
pushd /usr/src/nginx-${NGINX_VERSION}
  • 预编译安装:
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
44
45
make clean
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-openssl=/usr/src/openssl-${OPENSSL_VERSION} \
--with-pcre=/usr/src/pcre-${PCRE_VERSION} \
--with-zlib=/usr/src/zlib-${ZLIB_VERSION} \
--add-module=/usr/src/ngx-fancyindex-${FANCY_VERSION} \
--with-mail \
--with-threads \
--with-stream \
--with-compat \
--with-file-aio \
--with-http_v2_module \
--with-mail_ssl_module \
--with-http_sub_module \
--with-http_ssl_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_slice_module \
--with-stream_ssl_module \
--with-http_realip_module \
--with-http_gunzip_module \
--with-http_addition_module \
--with-stream_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_secure_link_module \
--with-http_auth_request_module \
--with-http_xslt_module=dynamic \
--with-http_random_index_module \
--with-http_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-stream_geoip_module=dynamic \
--with-http_image_filter_module=dynamic \
--http-client-body-temp-path=/var/cache/nginx/client \
--http-proxy-temp-path=/var/cache/nginx/proxy \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi \
--http-scgi-temp-path=/var/cache/nginx/scgi \
--with-debug

编译并安装

1
2
3
4
5
6
7
make -j 4 && make install
popd
rm -rf /usr/src/pcre-${PCRE_VERSION}
rm -rf /usr/src/zlib-${ZLIB_VERSION}
rm -rf /usr/src/openssl-${OPENSSL_VERSION}
rm -rf /usr/src/ngx-fancyindex-${FANCY_VERSION}
rm -rf /usr/src/nginx-${NGINX_VERSION}

安装完成

创建相关目录

1
mkdir -p /var/cache/nginx/{client,proxy,fastcgi,uwsgi,scgi}

创建软链接

1
ln -s /usr/local/nginx/sbin/nginx /usr/sbin

原始命令

启动nginx服务
1
nginx [-c PATH]
检查配置文件是否正确
1
nginx -t [-c PATH]
重新加载配置文件
1
nginx -s reload
日志文件回滚
  • 重新打开日志文件,切割日志,防止日志文件过大
1
nginx -s reopen
优雅地停止Nginx
1
nginx -s quit
快速地停止Nginx(不推荐)
1
nginx -s stop
获取版本信息
1
nginx -v
获取编译时的参数
1
nginx -V

配置Nginx服务开机自启

1
vim /etc/rc.local
1
/usr/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

服务启动脚本

  • 请在Sysv init脚本和Systemd配置文件中任选其一。

提供Sysv init脚本

CentOS系统

  • 创建文件:
1
vim /etc/init.d/nginx
  • 文件内容:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/bin/bash
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename ${nginx})

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

lockfile="/var/lock/subsys/nginx"

start() {
[ -x ${nginx} ] || exit 5
[ -f ${NGINX_CONF_FILE} ] || exit 6
echo -n $"Starting ${prog}: "
daemon ${nginx} -c ${NGINX_CONF_FILE}
retval=$?
echo
[ ${retval} -eq 0 ] && touch ${lockfile}
return ${retval}
}

stop() {
echo -n $"Stopping ${prog}: "
killproc ${prog} -QUIT
retval=$?
echo
[ ${retval} -eq 0 ] && rm -f ${lockfile}
return ${retval}
}

restart() {
configtest || return $?
stop
sleep 1
start
}

reload() {
configtest || return $?
echo -n $"Reloading ${prog}: "
killproc ${nginx} -HUP
RETVAL=$?
echo
}

force_reload() {
restart
}

configtest() {
${nginx} -t -c ${NGINX_CONF_FILE}
}

rh_status() {
status ${prog}
}

rh_status_q() {
rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart | try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
  • 为脚本赋予执行权限:
1
chmod 755 /etc/init.d/nginx
  • 启动服务并开机自启:
1
2
3
service nginx start
chkconfig --add nginx
chkconfig --level 35 nginx on

Ubuntu系统

  • 创建文件:
1
vim /etc/init.d/nginx
  • 文件内容:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/bash

### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network $syslog $named
# Required-Stop: $local_fs $remote_fs $network $syslog $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
DAEMON="/usr/sbin/nginx"
NAME="nginx"
DESC="nginx"
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

test -x ${DAEMON} || exit 0

# Source function library.
. /lib/init/vars.sh
. /lib/lsb/init-functions

PID=$(cat ${NGINX_CONF_FILE} | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)

if [ -z "${PID}" ]
then
PID="/var/run/nginx.pid"
fi


do_start()
{
start-stop-daemon --start --quiet --pidfile ${PID} --exec ${DAEMON} --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile ${PID} --exec ${DAEMON} -- \
${DAEMON_OPTS} 2>/dev/null \
|| return 2
}

test_nginx_config() {
${DAEMON} -t ${DAEMON_OPTS} >/dev/null 2>&1
}

do_stop()
{
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile ${PID} --name ${NAME}
RETVAL="$?"
sleep 1
return "$RETVAL"
}

do_reload() {
start-stop-daemon --stop --signal HUP --quiet --pidfile ${PID} --name ${NAME}
return 0
}

# Rotate log files
do_rotate() {
start-stop-daemon --stop --signal USR1 --quiet --pidfile ${PID} --name ${NAME}
return 0
}

case "$1" in
start)
[ "${VERBOSE}" != no ] && log_daemon_msg "Starting ${DESC}" "${NAME}"
do_start
case "$?" in
0|1) [ "${VERBOSE}" != no ] && log_end_msg 0 ;;
2) [ "${VERBOSE}" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "${VERBOSE}" != no ] && log_daemon_msg "Stopping ${DESC}" "${NAME}"
do_stop
case "$?" in
0|1) [ "${VERBOSE}" != no ] && log_end_msg 0 ;;
2) [ "${VERBOSE}" != no ] && log_end_msg 1 ;;
esac
;;
restart)
log_daemon_msg "Restarting ${DESC}" "${NAME}"

# Check configuration before stopping nginx
if ! test_nginx_config; then
log_end_msg 1 # Configuration error
exit 0
fi

do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
reload|force-reload)
log_daemon_msg "Reloading ${DESC} configuration" "${NAME}"

# Check configuration before reload nginx
if ! test_nginx_config; then
log_end_msg 1 # Configuration error
exit 0
fi

do_reload
log_end_msg $?
;;
configtest|testconfig)
log_daemon_msg "Testing ${DESC} configuration"
test_nginx_config
log_end_msg $?
;;
status)
status_of_proc -p ${PID} "${DAEMON}" "${NAME}" && exit 0 || exit $?
;;
rotate)
log_daemon_msg "Re-opening ${DESC} log files" "${NAME}"
do_rotate
log_end_msg $?
;;
*)
echo "Usage: ${NAME} {start|stop|restart|reload|force-reload|status|configtest|rotate}" >&2
exit 3
;;
esac
  • 为脚本赋予执行权限:
1
chmod 755 /etc/init.d/nginx
  • 启动服务并开机自启:
1
2
service nginx start
update-rc.d nginx defaults

提供Systemd配置文件

  • 创建文件:
1
vim /etc/systemd/system/nginx.service
  • 文件内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP ${MAINPID}
ExecStop=/bin/kill -s QUIT ${MAINPID}
PrivateTmp=false

[Install]
WantedBy=multi-user.target
  • 启动服务并开机自启:
1
2
systemctl start nginx.service
systemctl enable nginx.service

温馨补充

获取nginx的进程

1
ps aux | grep "nginx"

获取nginx的端口号

1
netstat -nlput | grep "nginx"

预编译参数释义

  • --prefixnginx的安装目录;
  • --pid-pathpid文件位置,默认在logs目录;
  • --lock-pathlock文件位置,默认在logs目录;
  • --user:指定Nginx worker进程运行时所属的用户,切勿设置为root
  • --group:指定Nginx worker进程运行时所属的组;
  • --with-http_ssl_module:开启HTTP SSL模块,以支持HTTPS请求;
  • --with-http_dav_module:开启WebDAV扩展动作模块,可为文件和目录指定权限;
  • --with-http_flv_module:支持对FLV文件的拖动播放;
  • --with-http_realip_module:支持显示真实来源IP地址;
  • --with-http_gzip_static_module:预压缩文件传前检查,防止文件被重复压缩;
  • --with-http_stub_status_module:取得一些nginx的运行状态;
  • --with-mail:安装POP3/IMAP4/SMTP代理模块;
  • --with-mail_ssl_module:使POP3/IMAP/SMTP可以使用SSL/TLS
  • --with-opensslOpenSSL的源码包路径;
  • --with-pcrePCRE的源码包路径;
  • --with-zlibzlib的源码包路径;
  • --http-client-body-temp-path:设置客户端(client)请求临时文件路径;
  • --http-proxy-temp-path:设置http proxy临时文件路径;
  • --http-fastcgi-temp-path:设置http fastcgi临时文件路径;
  • --http-uwsgi-temp-path:设置uwsgi临时文件路径;
  • --http-scgi-temp-path:设置scgi临时文件路径;
  • --with-debug:允许调试日志;

进阶操作

日志切割

  • 服务日志的重要性在这里就不再赘述了,日志会随着服务运行时间的增加而增加,当日志过大时,则不利于我们查找内容;
  • 使用mv命令将旧的日志文件重命名或移动到新位置,但是Nginx默认还是将日志写入该文件;
  • 使用nginx -s reopen命令重新打开日志文件,则将新的日志信息写入到新文件,实现了日志的切割;

平滑升级Nginx

  • Nginx支持不重启服务来完成新版本的平滑升级;
  • 通知正在运行的旧版本Nginx准备升级,通过向master进程发送SIGUSR2信号可达到目的,此时旧版本的PID文件会由nginx.pid重命名为nginx.pid.oldbin

发送SIGUSR2信号

  • 使用PID文件的路径代替Nginx_Master_PID
1
kill -s SIGUSR2 Nginx_Master_PID
  • 启动新版本的Nginx,这时新旧版本的Nginx在同时运行;
  • 向旧版本的master进程发送SIGQUIT信号,以优雅的方式关闭旧版本的Nginx

发送SIGQUIT信号

  • 使用PID文件的路径代替Nginx_Master_PID
1
kill -s SIGQUIT Nginx_Master_PID

有你就有世界,感谢有你,昕!
0%