信号可以用来控制nginx。nginx的主进程ID号默认写入/usr/local/nginx/logs/nginx.pid文件,可以在配置阶段修改文件名,或者在nginx.conf中使用pid指令进行修改。主进程支持以下信号:
单独的工作进程也能被信号控制,尽管这不是必须的。支持的信号有:
发送HUP信号到主进程,nginx将重新读取配置文件。主进程在接受到HUP信号后,先检验配置文件的语法正确性,再尝试应用新的配置,即打开日志文件和新的监听套接字。若应用配置文件失败,回滚到先前的配置;若应用成功,启动新的工作进程,并发送消息给旧的工作进程要求它们正常关闭。旧的工作进程关闭监听的套接字并继续为旧的客户端服务。所有客户端被新的工作进程服务以后,旧的工作进程被关闭。
举个例子,假设nginx在FreeBSD 4.x下运行,执行以下命令:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
生成以下输出:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx) 33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx) 33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
编号为33129的旧工作进程仍然继续工作,一段时间后退出:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
为了滚动日志文件,需要先重命名日志文件,再发送USR1信号到主进程。主进程将会重新打开当前已打开的所有日志文件,并标示它们未授权的用户身份(工作进程运行的权限)。在重新打开成功后,主进程关闭所有打开的文件,发送消息给工作进程要求它们重新打开文件。于是工作进程立即打开新的文件并关闭旧的文件。因此,旧的文件几乎能立即响应post处理,例如压缩。
为了更新服务器可执行文件,需要先用新的可执行文件替代旧的,再发送USR2信号给主进程。主进程重命名它的进程ID文件,以.oldbin作为后缀,例如:/usr/local/nginx/logs/nginx.pid.oldbin,接着启动新的可执行文件,并相应地启动新的工作进程。
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx) 33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx) 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
在这之后所有的工作进程(新的和旧的)继续接受请求。如果发送WINCH信号到第一个主进程,它将发送消息给它的工作进程,请求它们正常关闭,接着这些工作进程开始退出:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx) 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
当在Linux下使用“rtsig”方法时,在发送WINCH信号给旧的主进程后,新的进程可能不会接受任何连接请求。如果是这样,需要同步发送USR1信号给新的主进程,直到新的进程开始接受连接请求。
一段时间后,只有新的工作进程将会处理请求:
PID PPID USER %CPU VSZ WCHAN COMMAND 33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx 36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
注意,旧的主进程不会关闭它所监听的套接字,在需要的情况下它能再次启动它的工作进程。如果由于某些原因新的可执行文件在执行时有误,可以按照下面的方式来解决:
如果新的主进程退出,旧的主进程将会撤消进程ID文件的.oldbin后缀。
如果更新成功,需要发送QUIT信号给旧的主进程,仅保留新的进程:
PID PPID USER %CPU VSZ WCHAN COMMAND 36264 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx) 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
nginx支持各种连接处理方法。对于每种特定的方法都需要有平台的支持,在支持多种方法的平台下nginx会自动选用最高效的方法。然而,如有需要,可以使用use指令显式指定所采用的连接处理方法。
以下的连接处理方法为nginx所支持的:
一些老的分发版像SuSE 8.2提供添加epoll支持到2.4内核的补丁。
队列溢出时,nginx取消队列并回到利用poll连接请求方法,直到情况正常为止。
为了快速处理静态数据集例如服务器名称、map指令的值、MIME类型、请求头字符串的名称,nginx使用hash表。在启动和每次重新配置过程中,nginx选择最小可能的hash表大小,例如桶大小,可以用来保存键和相同大小的hash值而不超过配置参数(hash桶大小)。hash表的大小以桶来表示。持续校准直到表大小超过hash最大值参数。大多数hash有对应的指令可以用来改变这些参数,例如,对于服务器名称,它们是server_names_hash_max_size和server_names_hash_bucket_size。
hash桶大小参数指定的大小是处理器cache大小的倍数。在现代处理器中这会减少内存访问次数,从而加快hash键的查找。如果hash桶大小同处理器cache大小相等,那么在最坏的情况下对键的查找中访存次数为2次——第一次计算桶地址,第二次在桶中查询键。因此,如果nginx发出增加hash最大值或hash桶大小的消息,那第一个参数将会被首先增加。
要启用调试日志,nginx需要在编译时配置为支持调试:
./configure --with-debug...
接着使用error_log指令设置调试级别:
error_log /path/to/log debug;
Windows下的nginx二进制版本通常被编译为支持调试日志,因此只需要设置调试级别就可以了。
重新定义日志而没有指定调试级别将会禁用调试日志。在下面的例子中,在server级别上重新定义日志会禁用这个服务器的调试日志。
error_log /path/to/log debug; http { server { error_log /path/to/log; ...
为了防止这个,可以注释掉重定义日志的那行,或者添加调试级别的说明:
error_log /path/to/log debug; http { server { error_log /path/to/log debug; ...
也可以仅为selected_client_addresses启用调试日志:
error_log /path/to/log; events { debug_connection 192.168.1.1; debug_connection 192.168.10.0/24; }
大小可以指定为bytes、kilobytes(后缀为k和K)或者megabytes(后缀为m和M),例如:“1024”、“8k”或“1M”。
时间间隔可以指定为毫秒、秒、分、时、天等等,使用以下后缀:
计量单位可以合并为单个数值,按照从大到小的顺序指定,可以选择用空格分割,例如:“1h 30m”可以指定为“90m”或者“5400s”。没有后缀的值表示秒。推荐使用后缀指定。
一些时间间隔仅可以用秒来指定。
Windows版的nginx使用原生的Win32 API(不是采用Cygwin模拟层)。现在只有select()连接处理方法被使用,因此高性能和可扩展性是不被期望的。因为这以及一些其他大家知道的原因,Windows版本的nginx被认为是beta版。在Windows下nginx的beta版,除了XSLT过滤、图像过滤、GeoIP模块和内置的Perl语言,它几乎提供了UNIX版nginx的所有功能。
安装windows下的nginx,下载最新开发版本(1.3.15),因为nginx开发分支包含所有已知的修正。解压分发版,进入nginx-1.3.15目录,运行nginx。以下是驱动器C:根目录下的例子:
cd c:\ unzip nginx-1.3.15.zip cd nginx-1.3.15 start nginx
运行tasklist命令行组件来查看nginx进程:
C:\nginx-1.3.15>tasklist /fi "imagename eq nginx.exe" Image Name PID Session Name Session# Mem Usage =============== ======== ============== ========== ============ nginx.exe 652 Console 0 2 780 K nginx.exe 1332 Console 0 3 112 K
其中之一为主进程,另外一个是工作进程。如果nginx无法启动,可以在错误日志文件logs\error.log里查看原因。如果日志文件已经被创建,错误原因可以在Windows事件日志里查看。如果显示的是错误页面而不是期望的页面,也可以在logs\error.log文件里查看原因。
Windows下nginx使用它运行时的目录作为配置中相对路径的前缀。对于上面的例子,前缀为C:\nginx-1.3.15\。另外,配置文件中路径的指定必须采用UNIX风格,即使用斜杠:
access_log logs/site.log; root C:/web/html;
Windows下nginx以标准控制台程序运行(不是服务),而且可以通过以下命令管理:
介绍篇中还未翻译的有以下三篇,之后会额外进行翻译。PS:初次翻译,问题肯定有很多,欢迎拍砖!