该目录用于放置从官网上下载的Nginx源码文件,以及第三方或我们自己所写的模块源代码文件。
该目录用于放置在configure命令执行后所生成的源文件及目录,以及make命令执行后生成的目标文件和最终连接成功的二进制文件。默认情况下,configure命令会将该目录命名为objs,并放在Nginx源代码目录下。
该目录存放实际Nginx服务运行期间所需要的二进制文件、配置文件等。默认情况下,该目录为/usr/local/nginx。
日志文件通常会比较大,当研究Nginx的底层架构时,需要打开debug级别的日志,这个级别的日志非常详细,会导致日志文件的大小增长得极快,需要预先分配一个拥有更大磁盘空间的目录。
在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态Web内容服务器、反向代理服务器或是提供图片缩略图功能(实时压缩图片)的服务器时,其内核参数的调整都是不同的。这里只针对最通用的、使Nginx支持更多并发请求的TCP网络参数做简单说明。
/etc/sysctl.conf
/etc/sysctl.conffs.file-max=999999 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_fin_timeout=30 net.ipv4.tcp_max_tw_buckets =5000 net.ipv4.ip_local_port_range=1024 61000 net.ipv4.tcp_rmem=4096 32768 262142 net.ipv4.tcp_wmem=4096 32768 262142 net.core.netdev_max_backlog=8096 net.core.rmem_default=262144 net.core.wmem_default=262144 net.core.rmem_max=2097152 net.core.wmem_max=2097152 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_max_syn.backlog=1024
file-max:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并发连接数,需根据实际情况配置。
tcp_tw_reuse:这个参数设置为1,表示允许将TIME-WAIT状态的socket重新用于新的TCP连接,这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
tcp_keepalive_time:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置得小一些,可以更快地清理无效的连接。
tcp_fin_timeout:这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间。
tcp_max_tw_buckets:这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
tcp_max_syn_backlog:这个参数表示TCP三次握手建立阶段接收SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
ip_local_port_range:这个参数定义了在UDP和TCP连接中本地(不包括连接的远端)端口的取值范围。
net.ipv4.tcp_rmem:这个参数定义了TCP接收缓存(用于TCP接收滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_wmem:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。
rmem_default:这个参数表示内核套接字接收缓存区默认的大小。
wmem_default:这个参数表示内核套接字发送缓存区默认的大小。
rmem_max:这个参数表示内核套接字接收缓存区的最大大小。
wmem_max:这个参数表示内核套接字发送缓存区的最大大小。
注意:滑动窗口的大小与套接字缓存区会在一定程度上影响并发连接的数目。每个TCP连接都会为维护TCP滑动窗口而消耗内存,这个窗口会根据服务器的处理速度收缩或扩张。 参数wmem_max的设置,需要平衡物理内存的总大小、Nginx并发处理的最大连接数量(由nginx.conf中的worker_processes和worker_connections参数决定)而确定。当然,如果仅仅为了提高并发量使服务器不出现Out OfMemory问题而去降低滑动窗口大小,那么并不合适,因为滑动窗口过小会影响大数据量的传输速度。rmem_default、wmem_default、rmem_max、wmem_max这4个参数的设置需要根据我们的业务特性以及实际的硬件成本来综合考虑。
官网: http://nginx.org/en/download.html
shellcd 到解压目录下 ./configure make make install
./configure
configure命令做了大量的“幕后”工作,包括检测操作系统内核和已经安装的软件,参数的解析,中间目录的生成以及根据各种参数生成一些C源码文件、Makefile文件等。
make
make命令根据configure命令生成的Makefile文件编译Nginx工程,并生成目标文件、最终的二进制文件。
make install
make install命令根据configure执行时的参数将Nginx部署到指定的安装目录,包括相关目录的建立和二进制文件、配置文件的复制。
官方文档:http://nginx.org/en/docs/configure.html
默认情况下,Nginx被安装在目录 /usr/local/nginx/ 中,其二进制文件路径为 /usr/local/nginc/sbin/nginx,配置文件路径为 /usr/local/nginx/conf/nginx.conf。当然,在configure执行时是可以指定把它们安装在不同目录的。
/usr/local/nginx/sbin/nginx
直接二进制启动:
/usr/local/nginx/sbin/nginx -c /tmp/nginx.conf
指定配置文件启动:
/usr/local/nginx/sbin/nginx -p /usr/local/nginx/
指定安装目录启动:
/usr/local/nginx/sbin/nginx -g "pid /var/nginx/test.pid"
上面这行命令意味着会把pid文件写到/var/nginx/test.pid中
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -t -q
/usr/local/nginx/sbin/nginx -v
/usr/local/nginx/sbin/nginx -V
/usr/local/nginx/sbin/nginx -s stop
---等价
kill -s SIGTERM
---等价
kill -s SIGINT
/usr/local/nginx/sbin/nginx -s quit
---等价
kill -s SIGWINCH
---等价
kill -s SIGQUIT
/usr/local/nginx/sbin/nginx -s reload
---等价
kill -s SIGHUP
/usr/local/nginx/sbin/nginx -s reopen
---等价
kill -s SIGUSR1
日志文件回滚
使用-s reopen参数可以重新打开日志文件,这样可以先把当前日志文件改名或转移到其他目录中进行备份,再重新打开时就会生成新的日志文件。这个功能使得日志文件不至于过大。
平滑升级Nginx
通知正在运行的旧版本Nginx准备升级
kill -s SIGUSR2
nginx 支持单进程和 master-worker 两种方式进行进程管理
nginx 目录结构
|-- client_body_temp |-- conf #这是Nginx所有配置文件的目录,极其重要 | |-- fastcgi.conf #fastcgi相关参数的配置文件 | |-- fastcgi.conf.default #fastcgi.conf的原始备份 | |-- fastcgi_params #fastcgi的参数文件 | |-- fastcgi_params.default | |-- koi-utf | |-- koi-win | |-- mime.types #媒体类型, | |-- mime.types.default | |-- nginx.conf #这是Nginx默认的主配置文件 | |-- nginx.conf.default | |-- scgi_params #scgi相关参数文件,一般用不到 | |-- scgi_params.default | |-- uwsgi_params #uwsgi相关参数文件,一般用不到 | |-- uwsgi_params.default | `-- win-utf |-- fastcgi_temp #fastcgi临时数据目录 |-- html #这是编译安装时Nginx的默认站点目录,类似Apache的默认站点htdocs目录 | |--50x.html # 错误页面优雅替代显示文件,例如:出现502错误时会调用此页面 # error_page 500502503504 /50x.html; | `-- index.html # 默认的首页文件,首页文件名字是在nginx.conf中事先定义好的。 |-- logs #这是Nginx默认的日志路径,包括错误日志及访问日志 | |-- access.log # 这是Nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站用户访问情况信息 | |-- error.log # 这是Nginx的错误日志文件,如果Nginx出现启动故障等问题,一定要看看这个错误日志 | `-- nginx.pid # Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件 |-- proxy_temp #临时目录 |-- sbin #这是Nginx命令的目录,如Nginx的启动命令nginx | `-- nginx #Nginx的启动命令nginx |-- scgi_temp #临时目录 `-- uwsgi_temp #临时目录
nginxuser nobody nobody; worker_processes 8; error_log /var/log/nginx/error.log error; pid logs/nginx.pid; worker_rlimit_nofile 65535; events{ use epoll; worker_connections 65536; }
块配置项由一个块配置项名称和一对大括号组成,示例如下:
nginxevents { .... } http { upstream backend { server 127.0.0.1:8080 } gzip on; server { ... location /webstatic { gizp off; } } }
代码段钟的 events,upstream,server,location 等都是块配置项,块配置项后面是否带参数(如 location 的 /webstatic)则由该模块决定
配置项名 配置项值1 配置项值2 ...;
行首配置项名:
配置项值:
结尾分号
注意:如果配置项值钟包含语法符号,空格符,那么需要使用单引号或双引号括住配置项值,否则 nginx 回报语法错误
log_format main 'remote_user [request"';
#pid logs/nginx.pid;
大部分模块遵循通用的规定
如:
shellgzip_buffers 4 8k; client_max_body_size 64M;
如:
nginxexpires 10y; proxy_read_timeout 600; client_body_timeout 2m;
配置项后的值究竟是否可以使用这些单位,取决于解析该配置项的模块。如果这个模块使用了Nginx框架提供的相应解析配置项方法,那么配置项值才可以携带单位。
有些模块允许在配置项中使用变量,如
nginxlog_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
remote_addr是一个变量,使用它的时候前面要加上$符号。
需要注意的是,这种变量只有少数模块支持,并不是通用的
提示:在执行configure命令时,我们已经把许多模块编译进Nginx中,但是否启用这些模块,一般取决于配置文件中相应的配置项。换句话说,每个Nginx模块都有自己感兴趣的配置项,大部分模块都必须在nginx.conf中读取某个配置项后才会在运行时启用。例如,只有当配置http{...}这个配置项时,ngx_http_module模块才会在Nginx中启用,其他依赖ngx_http_module的模块也才能正常使用。
Nginx 在运行时,至少必须加载几个核心模块和一个事件类模块。这些模块运行时所支持的配置项称为基本配置——所有其他模块执行时都依赖的配置项。
配置项较多,把它们按照用户使用时的预期功能分成了以下4类:
有些配置项,即使没有显式配置,也会有默认值,如 daemon,即使在nginx.conf中没有对它进行配置,也相当于打开了这个功能
语法: daemon on|off;
默认:daemon on;
脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断
语法:master_process on|off;
默认:master_process on;
语法:error_log /path/file level;
默认:error_log logs/error.log error;
可以根据自己的需求设置error日志的路径和级别。
使用 /dev/null 作为文件路径,不会输出任何日志,这也是关闭 error 日志的唯一手段
取值范围是debug、info、notice、warn、error、crit、alert、emerg,从左至右级别依次增大
如果日志级别设定到debug,必须在configure时加入--with-debug配置项。
语法:debug_points[stop|abort]
语法:debug_connection[IP|CIDR]
这个配置项实际上属于事件类配置,因此,它必须放在events{...}中才有效。它的值可以是IP地址或CIDR地址
例如:
nginxevents { debug_connection 10.224.66.14; debug_connection 10.224.57.0/24; }
仅仅来自以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别
使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效
语法:worker_rlimit_core size;
语法:working_directory path;
语法:env VAR|VAR=VALUE;
语法:include/path/file;
nginxinclude mime.types; include vhost/*.conf;
语法:pid path/file;
默认:pid logs/nginx.pid;
语法:user username[groupname];
默认:user nobody nobody;
语法:worker_rlimit_nofile limit;
语法:worker_rlimit_sigpending limit;
语法:worker_processes number;
默认:worker_processes 1;
语法:worker_cpu_affinity cpumask[cpumask...];
4个 cpu 配置
nginxworker_processes 4; worker_cpu_affinity 1000 0100 0010 0001;
注意:worker_cpu_affinity配置仅对Linux操作系统有效。Linux操作系统使用sched_setaffinity()系统调用实现这个功能
语法:ssl_engine device;
openssl engine -t
查看是否有 SSL 硬件加速设备语法:timer_resolution t;
默认情况下,每次内核的事件调用(如epoll、select、poll、kqueue等)返回时,都会执行一次gettimeofday,实现用内核的时钟来更新Nginx中的缓存时钟
当需要降低gettimeofday的调用频率时,可以使用timer_resolution配置。例如,“timer_resolution 100ms;”表示至少每100ms才调用一次gettimeofday。
早期的Linux内核中,gettimeofday的执行代价不小,而目前的大多数内核钟,gettimeofday只是一次vsyscall,仅仅对共享内存页中的数据做访问,并不是通常的系统调用,代价并不大,一般不必使用这个配置
语法:worker_priority nice;
默认:worker_priority 0;
语法:accept_mutex[on|off]
默认:accept_mutext on;
语法:lock_file path/file;
默认:lock_file logs/nginx.lock;
注意:在基于i386、AMD64、Sparc64、PPC64体系架构的操作系统上,若使用GCC、Intel C++、SunPro C++编译器来编译Nginx,则可以肯定这时的Nginx是支持原子锁的,因为Nginx会利用CPU的特性并用汇编语言来实现它(可以参考14.3节x86架构下原子操作的实现)。这时的lock_file配置是没有意义的。
语法:accept_mutex_delay Nms;
默认:accept_mutex_delay 500ms;
语法:multi_accept[on|off];
默认:multi_accept off;
当事件模型通知有新连接时,尽可能地对本次调度中客户端发起的所有TCP请求都建立连接。
语法:use[kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];
默认:Nginx会自动使用最适合的事件模型。
对于Linux操作系统来说,可供选择的事件驱动模型有poll、select、epoll三种。epoll当然是性能最高的一种
语法:worker_connections number;
定义每个worker进程可以同时处理的最大连接 数。
本文作者:Yui_HTT
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!