Nginx 配置文件详解

lance 2020-04-03 AM 87℃ 0条

配置文件结构

  • 全局配置(user/worker_processes/error_log/pid)
  • events(网络连接相关,worker_connections)
  • http(最重要的部分,大部分功能在这里)
  • server(虚拟主机相关)
  • location(server 里面)

全局配置项结构

nginx.conf

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

pid logs/nginx.pid;
定义 nginx 进程 pid 文件所在路径,可以是相对路径,也可以是绝对路径。

worker_rlimit_nofile 100000;
定义 nginx 最多打开文件数限制。如果没设置的话,这个值为操作系统(ulimit -n)的限制保持一致。
把这个值设高,nginx 就不会有 “too many open files” 问题了。

events 配置项结构

events 配置部分

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。
* 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 配置部分

官方文档:http://nginx.org/en/docs/
参考链接:https://segmentfault.com/a/1190000012672431
参考链接:https://segmentfault.com/a/1190000002797601
http 的 header:https://kb.cnblogs.com/page/92320/

MIME-Type
include mime.types;
可以 cat conf/mime.types 查看具体哪些 types
定义 nginx 能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等)

default_type application/octet-stream;
定义默认的 type,如果不定义改行,默认为 text/plain.

log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
其中 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 - 启用压缩,如果 header 头中不包含 "Last-Modified" 头信息
no_etag - 启用压缩 ,如果 header 头中不包含 "ETag" 头信息
auth - 启用压缩 , 如果 header 头中包含 "Authorization" 头信息
any - 无条件启用压缩

gzip_vary on;
和 http 头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过 gzip 压缩的页面,例如,用 Squid 缓存经过 Nginx 压缩的数据。

server 配置项

server 部分配置

server{} 包含在 http{} 内部,每一个 server{} 都是一个虚拟主机(站点)。

以下为 nginx.conf 配置文件中 server{} 部分的内容。
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 页面
    error_page 500 502 503 504 /50x.html;  # 当状态码为 500、502、503、504 时,则访问 50x.html
    location = /50x.html {
        root html;  # 定义 50x.html 所在路径
    }
    # 定义访问 php 脚本时,将会执行本 location{} 部分指令
    #location ~ \.php$ {
    #    proxy_pass http://127.0.0.1;  # proxy_pass 后面指定要访问的 url 链接,用 proxy_pass 实现代理。
    #}

    #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 相关的变量
    #}

    #location ~ /\.ht {   # 访问的 url 中,以 /.ht 开头的,如,www.example.com/.htaccess,会被拒绝,返回 403 状态码。
    #    deny all;  # 这里的 all 指的是所有的请求。
    #}
}

#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 {
#    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;
#    }
#}

标签: linux, nginx

非特殊说明,本博所有文章均为博主原创。

觉得文章不错,打赏一点吧,1分也是爱😀

WeChat Pay

微信打赏

Alipay

支付宝打赏

评论啦~