# 配置文件 - yum安装的配置文件路径:`/etc/nginx/nginx.conf` - 源码安装的配置文件路径:`/usr/local/nginx/conf/nginx.conf` - 两个方式安装的配置文件有所区别,但实际内容都是相同的。 ## 配置文件结构 - 全局配置(user、worker_processes、error_log、pid) - events(网络连接相关、worker_connections、multi_accept、use) - http(http全局配置、server、upstream) - server(虚拟主机配置) - location(URL匹配) - upstream(负载均衡配置) ## 全局配置项结构 ```bash [root@lwz ~]# cat /usr/local/nginx/conf/nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; ``` * **user nobody;** 定义运行nginx服务的用户,还可以加上组,如 user nobody nobody; * **worker_processes 1;** 定义nginx子进程数量,即提供服务的进程数量,该数值建议和服务cpu核数保持一致。 除了可以定义数字外,还可以定义为auto,表示让系统自动调整。 - **error_log logs/error.log;** 定义错误日志的路径,可以是相对路径(相对prefix路径的),也可以是绝对路径。 该配置可以在此处定义,也可以定义到http、server、location里 - **error_log logs/error.log notice;** 定义错误日志路径以及日志级别. 错误日志级别:常见的错误日志级别有[debug|info|notice|warn|error|crit|alert|emerg],级别越高记录的信息越少。 如果不定义默认是error,建议定义为crit,即只记录重要的错误信息。 * **pid logs/nginx.pid;** 定义nginx进程pid文件所在路径,可以是相对路径,也可以是绝对路径。 - **worker_rlimit_nofile 100000;** 定义nginx最多打开文件数限制。如果没设置的话,这个值为操作系统(ulimit -n)的限制保持一致。 把这个值设高,nginx就不会有“too many open files”问题了。 ## events配置项结构 ```bash events { worker_connections 1024; } ``` - **worker_connections 1024;** 定义每个work_process同时开启的最大连接数,即允许最多只能有这么多连接。 - **accept_mutex on;** 当某一个时刻只有一个网络连接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗一定的服务器性能。 Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收连接时进行序列化,防止多个进程争抢资源。 默认就是on。 - **multi_accept on;**(可做优化。开启此项,避免资源浪费) nginx worker processer可以做到同时接收多个新到达的网络连接,前提是把该参数设置为on。 默认为off,即每个worker process一次只能接收一个新到达的网络连接。 - **use epoll;** Nginx服务器提供了多个事件驱动器模型来处理网络消息。 其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。**主要使用epoll**: - select: 只能在Windows下使用,这个事件模型不建议在高负载的系统使用 - poll: Nginx默认首选,但不是在所有系统下都可用 - kqueue: 这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的 - **epoll: 这种方式是在Linux 2.6+内核中最高效的方式** - rtsig: 实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中 - /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式 - eventport: Solaris 10最高效的方式 ## http配置项结构 [官方文档](http://nginx.org/en/docs/) [参考链接](https://segmentfault.com/a/1190000012672431) [参考链接](https://segmentfault.com/a/1190000002797601) [http的header参考链接](https://kb.cnblogs.com/page/92320/) ```bash http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; ``` - **MIME-Type** - **include mime.types;** 文件路径在:`cat conf/mime.types` 定义nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等) - **default_type application/octet-stream;** 定义默认的type,如果不定义该项,默认为text/plain. * **log_format main** 其中main为日志格式的名字,后面的为nginx的内部变量组成的一串字符串。 * **access_log logs/access.log main;** 定义日志的路径以及采用的日志格式,该参数可以在server配置块中定义。 - **sendfile on;**(优化:建议开启) 是否调用sendfile函数传输文件,默认为off,使用sendfile函数传输,可以减少user mode和kernel mode的切换,从而提升服务器性能。 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。 - **sendfile_max_chunk 128k;**(与上一条关联) 该参数限定Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0,如果设置为0则无限制。 + **tcp_nopush on;** 当tcp_nopush设置为on时,会调用tcp_cork方法进行数据传输。 使用该方法会产生这样的效果:当应用程序产生数据时,内核不会立马封装包,而是当数据量积累到一定量时才会封装,然后传输。这样有助于解决网络堵塞问题。 默认值为on。举例:快递员收快递、发快递,包裹累积到一定量才会发,节省运输成本。 * **keepalive_timeout 65 60;** 该参数有两个值,第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间,单位是秒,默认为75s。 第二个值可以省略,它是针对客户端的浏览器来设置的,可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60,如果不设置就没有这一项。 第二个数值设置后,浏览器就会根据这个数值决定何时主动关闭连接,Nginx服务器就不操心了。但有的浏览器并不认可该参数。 - **send_timeout** 这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。 如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。 + **client_max_body_size 10m;** 浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size是用来限制Content-Length所示值的大小的。 这个限制包体的配置不用等Nginx接收完所有的HTTP包体,就可以告诉用户请求过大不被接受。会返回413状态码。 例如,用户试图上传一个1GB的文件,Nginx在收完包头后,发现Content-Length超过client_max_body_size定义的值, 就直接发送413(Request Entity Too Large)响应给客户端。 - **gzip on;** 该参数用于开启或关闭gzip压缩功能。 - **gzip_min_length 1k;** 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数,小于1k可能会越压越大。 - **gzip_buffers 4 16k;** 设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流。4 16k代表分配4个16k的buffer。 - **gzip_http_version 1.1;** 用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户会看到乱码,所以为了支持前期版本加上了这个选项。 如果你用了Nginx反向代理并期望也启用Gzip压缩的话,由于末端通信是http/1.1,故请设置为 1.1。 - **gzip_comp_level 6;** gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu) - **gzip_types mime-type ... ;** 匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。 在`conf/mime.conf`里查看对应的type。 示例:gzip_types text/plain application/x-javascript text/css text/html application/xml; - **gzip_proxied any;** Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。 以下为可用的值: - **off**: 关闭所有的代理结果数据的压缩 - **expired**: 启用压缩,如果header头包含”Expires”字段 - **no-cache**: 启用压缩,如果header头包含”Cache-Control:no-cache”字段 - **no-store**: 启用压缩,如果header头包含”Cache-Control:no-store”字段 - **private**: 启用压缩,如果header头包含”Cache-Control:private”字段 - **no_last_modified**: 启用压缩, 假如后端相应中不包含”Last-Modified”头信息 - **no_etag**: 启用压缩 , 假如后端相应中不包含”Etag”头信息 - **auth**: 启用压缩 , 假如后端相应中不包含”Authorization”头信息 - **any**: 无条件启用压缩 - **gzip_vary on;** 和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。 ### server配置项 server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点)。 ```bash server { listen 80; # 监听端口为80,可以自定义其他端口,也可以加上IP地址,如,listen 127.0.0.1:8080; server_name localhost; # 定义网站域名,可以写多个,用空格分隔。 #charset koi8-r; # 定义网站的字符集,一般不设置,而是在网页代码中设置。 #access_log logs/host.access.log main; # 定义访问日志,可以针对每一个server(即每一个站点)设置它们自己的访问日志。 ##在server{}里有很多location配置段 location / { root html; # 定义网站根目录,目录可以是相对路径也可以是绝对路径。 index index.html index.htm; # 定义站点的默认页。 } #error_page 404 /404.html; # 定义404页面 # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; # 当状态码为500、502、503、504时,则访问50x.html location = /50x.html { root html; # 定义50x.html所在路径 } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #定义访问php脚本时,将会执行本location{}部分指令 #location ~ \.php$ { # proxy_pass http://127.0.0.1; # proxy_pass后面指定要访问的url链接,用proxy_pass实现代理。 #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # 定义FastCGI服务器监听端口与地址,支持两种形式,1 IP:Port, 2 unix:/path/to/sockt # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # 定义SCRIPT_FILENAME变量,后面的路径/scripts为上面的root指定的目录 # include fastcgi_params; # 引用prefix/conf/fastcgi_params文件,该文件定义了fastcgi相关的变量 #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # 访问的url中,以/.ht开头的,如,www.example.com/.htaccess,会被拒绝,返回403状态码。 # deny all; # 这里的all指的是所有的请求。 #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # 监听8000端口 # listen somename:8080; # 指定ip:port # server_name somename alias another.alias; # 指定多个server_name # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # 监听443端口,即ssl # server_name localhost; ### 以下为ssl相关配置 # ssl_certificate cert.pem; # 指定pem文件路径 # ssl_certificate_key cert.key; # 指定key文件路径 # ssl_session_cache shared:SSL:1m; # 指定session cache大小 # ssl_session_timeout 5m; # 指定session超时时间 # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 指定ssl协议 # ssl_ciphers HIGH:!aNULL:!MD5; # 指定ssl算法 # ssl_prefer_server_ciphers on; # 优先采取服务器算法 # location / { # root html; # index index.html index.htm; # } #} include vhosts/*.conf; # 可以定义引入某个目录下的虚拟主机配置,如这里配置的vhost/*.conf,意为引入vhost目录下的所有.conf结尾的虚拟主机配置。 include conf.d/*.conf; # 可以继续增加其他路径 }