编译Nginx的环境要求如下:
磁盘空间:需要保证有10MB以上的剩余磁盘空间。Nginx安装完毕后会占据4MB左右的磁盘空间,实际的磁盘空间需求会因编译设置和是否安装第三方模块而有所不同。
GCC编译器及相关工具:GCC全称为GNU Compiler Collection, 是GNU社区推出的功能强大、性能优越的用于编程开发的自由编译器,是GNU的代表作品之一,目前可以编译的语言包括:C、C++、Objective-C、Fortran、Java等。您必须确保您的操作系统安装有GCC编译器。
另外,您还必须安装Autoconf和Automake工具,它们用于自动创建功能完善的Makefile,当前大多数软件包都是用这一工具生成Makefile的,Nginx也不例外。在CentOS系统下,您可以使用yum命令安装GCC编译器及相关工具:
1 |
yum -y install gcc gcc-c++ autoconf automake |
模块依赖性:Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib库,rewrite模块需要pcre库,ssl功能需要openssl库等。同样,如果是在CentOS系统下,我们可以使用yum命令安装或下载源码包编译安装这些模块依赖的库:
1 |
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel |
Nginx在Linux环境下可以通过编译源码的方式来安装,最简单的安装命令如下:
1 2 3 4 5 |
wget http://nginx.org/download/nginx-1.0.2.tar.gz tar zxvf nginx-1.0.2.tar.gz cd nginx-1.0.2 ./configure make && make install |
按照以上命令,Nginx将被默认安装到/usr/local/nginx目录下。您可以通过/configure –help命令查看Nginx可选择的编译选项。
编译选项举例如下:
–prefix=
–sbin-path=
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/sbin/nginx --conf-path=<path> - 在没有给定 –c 选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf --pid-path=<path> - 在nginx.conf中没有指定pid指令的情况下,默认的Nginx.pid的路径。如果没有指定,默认为<prerix>/logs/nginx.pid --lock-path=<path> - nginx.lock文件的路径。 --error-log-path=<path> - 在nginx.conf中没有指定error_log指令的情况下,默认的错误日志的路径。如果没有指定,默认为 <prefix>/logs/error.log。 --http-log-path=<path> - 在nginx.conf中没有指定access_log指令的情况下,默认的访问日志的路径。如果没有指定,默认为 <prefix>/logs/access.log。 --user=<user> - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。 --group=<group> - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。 --builddir=DIR - 指定编译的目录 --with-rtsig_module - 启用 rtsig 模块最后安装 Nginx的启动,停止,平滑重启 启动Nginx 启动Nginx,可以执行以下命令。假设Nginx安装在/usr/local/nginx/目录中,那么启动Nginx的命令就是: <pre>/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf |
参数“-c”指定了配置文件的路径,如果不加“-c”参数,Nginx会默认加载其安装目录的conf子目录中的nginx.conf文件
Nginx的停止
Nginx的停止方法有很多种,一般通过发送系统信号给Nginx主进程的方式来停止Nginx。
我们可以通过ps命令来查找Nginx的主进程号:
1 |
ps –ef | grep nginx |
从图中可以看到,1个Nginx进程的备注信息为“master process”,表示它为主进程,另外的1个进程备注信息为“worker process”,表示它们为子进程。32244为主进程号。
如果在nginx.conf配置文件中指定了pid文件存放的路径(例如:/usr/local/webserver/nginx/logs/nginx.pid;),该文件中存放的就是Nginx当前的主进程号。如果没有指定pid文件存放的路径,nginx.pid文件默认存放在Nginx安装目录的logs目录下。所以,我们也可以直接通过以下命令来完成,省下寻找Nginx主进程号的步骤:
1 |
kill -信号类型 `/usr/local/webserver/nginx/logs/nginx.pid` |
(1)从容停止Nginx。
1 |
kill - QUIT Nginx主进程号 或者 kill -QUIT `/usr/local/webserver/nginx/logs/nginx.pid` |
(2)快速停止Nginx
1 |
kill - TERM Nginx主进程号 或者 kill -TERM `/usr/local/webserver/nginx/logs/nginx.pid` |
1 |
kill - INT Nginx主进程号 或者 kill -INT `/usr/local/webserver/nginx/logs/nginx.pid` |
(3)强制停止所有Nginx进程
1 |
pkill –9 nginx |
Nginx的平滑重启
如果改变了Nginx的配置文件(nginx conf),想重启Nginx,同样可以通过发送系统信号给Nginx主进程的方式来进行。不过,重启之前,要确认Nginx配置文件(nginx.conf)的语法是正确的,否则Nginx将不会加载新的配置文件。通过以下命令可以判断Nginx配置文件是否正确:
1 2 |
/usr/local/webserver/nginx/sbin/nginx –t -c /usr/local/webserver/nginx/conf/nginx.conf |
如果配置文件不正确,屏幕将会提示配置文件的第几行出错:
[emerg]:unknown directive”abc“in /usr/local/webserver/nginx/conf/nginx.conf:55
configuration file /usr/local/webserver/nginx/conf/nginx.conf test failed
如果配置文件正确,屏幕将提示以下两行信息:
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is OK
configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successful
这时候,就可以平滑重启Nginx了。
1 |
kill -HUP Nginx主进程号 |
1 |
kill -HUP `/usr/local/webserver/nginx/logs/nginx.pid` |
当Nginx接收到HUP信号时,它会尝试先解析配置文件,如果成功,就应用新的配置文件(例如,重新打开日志文件或监听的套接字)。之后,Nginx运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字,但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。如果新的配置文件应用失败,Nginx将继续使用旧的配置进行工作。
Nginx支持以下几种信号类型:
·TERM,INT快速关闭;
·QUIT从容关闭;
·HUP平滑重启,重新加载配置文件;
·USR1重新打开日志文件,在切割日志时用途较大;
·USR2平滑升级可执行程序;
·WINCH从容关闭工作进程。
Nginx的平滑升级
当需要将正在运行中的Nginx升级、添加,删除服务器模块时,可以在不中断服务的情况下,使用新版本、重编译的Nginx可执行程序替换旧版本的可执行程序。步骤如下:
(1)使用新的可执行程序替换旧的可执行程序,对于编译安装的Nginx,可以将新版本编译安装到旧版本的Nginx安装路径中。替换之前,您最好备份一下旧的可执行文件。
(2)发送以下指令:
kill –USR2 旧版本的nginx主进程号
(3)旧版本Nginx的主进程将重命名它的.pid文件为.oldbin(例如:/usr/local/webserver/nginx/logs/nginx.pid.oldbin),然后执行新版本的Nginx可执行程序,依次启动新的主进程和新的工作进程。
(4)此时,新、旧版本的Nginx实例会同时运行,共同处理输入的请求。要逐步停止旧版本的Nginx实例,你必须发送WINCH信号给旧的主进程,然后,它的工作进程就将开始从容关闭:
kill -WINCH 旧版本的Nginx主进程号
(5) 一段时间后,旧的工作进程(worker process)处理了所有已连接的请求后退出,仅由新的工作进程来处理输入的请求了:
(6)这时候,我们可以决定是使用新版本,还是恢复到旧版本:
kill –HUP 旧的主进程号:Nginx将在不重载配置文件的情况下启动它的工作进程;
kill –QUIT 新的主进程号:从容关闭其工作进程(worker process);
kill –TERM 新的主进程号:强制退出;
kill 新的主进程号或旧的主进程号:如果因为某些原因新的工作进程不能退出,则向其发送kill信号。
新的主进程退出后,旧的主进程会移除.oldbin前缀,恢复为它的.pid文件,这样,一切就都恢复到升级之前了。如果尝试升级成功,而你也希望保留新的服务器时,可发送QUIT信号给旧的主进程,使其退出而只留下新的服务器运行:
设置成系统开机服务:
在 /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 |
#!/bin/bash # nginx Startup script for the Nginx HTTP Server # this script create it by gcec at 2009.10.22. # it is v.0.0.1 version. # if you find any errors on this scripts,please contact gcec cyz. # and send mail to support at gcec dot cc. # # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx # pidfile: /var/run/nginx.pid # config: /usr/local/nginx/conf/nginx.conf nginxd=/app/nginx/sbin/nginx nginx_config=/app/nginx/conf/nginx.conf nginx_pid=/var/run/nginx.pid RETVAL=0 prog="nginx" # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -x $nginxd ] || exit 0 # Start nginx daemons functions. start() { if [ -e $nginx_pid ];then echo "nginx already running...." exit 1 fi echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL } # Stop nginx daemons functions. stop() { echo -n $"Stopping $prog: " killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid } # reload nginx service functions. reload() { echo -n $"Reloading $prog: " #kill -HUP `cat ${nginx_pid}` killproc $nginxd -HUP RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1 esac exit $RETVAL chkconfig --add nginx chkconfig --level 345 nginx on chkconfig --list nginx |
启动
1 |
service nginx start |
停止
1 |
service nginx stop |