Nginx配置之http/server块

395 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

http

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"';
  # 用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径
  # 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
  # 这里的 main 就是上面定义的日志格式名称
  access_log  logs/host.access.log  main;
  # 服务器名字的 hash 表大小
  server_names_hash_bucket_size  128;
  # 客户端请求头缓冲大小
  # nginx 默认会用 client_header_buffer_size 这个 buffer 来读取 header 值
  # 如果 header 过大,它会使用 large_client_header_buffers 来读取
  # 如果设置过小的 HTTP 头,或 Cookie 过大, 会报400 错误 nginx 400 bad request
  # 如果超过 buffer,就会报 HTTP 414 错误 (URI Too Long)
  # nginx 接受最长的 HTTP 头部大小必须比其中一个 buffer 大
  # 否则就会报 400 的 HTTP 错误 (Bad Request)
  client_header_buffer_size  32k;
  large_client_header_buffers  4  32k;
  # 隐藏ngnix版本号
  server_tokens  off;
  # 忽略不合法的请求头
  ignore_invalid_headers  on;
  # 让 nginx 在处理自己内部重定向时不默认使用 server_name 设置中的第一个域名
  server_name_in_redirect  off;
  # 客户端请求体的大小
  client_body_buffer_size  8m;
  # 开启文件传输,一般应用都应设置为 on;
  # 若是有下载的应用,则可以设置成 off 来平衡网络 I/O 和磁盘的 I/O 来降低系统负载
  sendfile  on;
  # 告诉 nginx 在一个数据包里发送所有头文件,而不一个接一个的发送
  tcp_nopush  on;
  # tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率
  # 在高延时、数据量大的通信场景中应该会有不错的效果
  # tcp_nodelay on,会增加小包的数量,但是可以提高响应速度
  # 在及时性高的通信场景中应该会有不错的效果
  tcp_nodelay  on;
  # 长连接超时时间,单位是秒
  keepalive_timeout  65;

  #*****gzip配置*****
  # gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
  # 开启 gzip
  gzip  on;
  # 最小压缩大小
  gzip_min_length  1k;
  # 压缩缓冲区
  gzip_buffers  4 16k;
  # 压缩版本
  gzip_http_version  1.0;
  # 压缩等级
  gzip_comp_level  2;
  # 压缩类型
  gzip_types   text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;


  # *****负载均衡*****
  # max_fails 为允许请求失败的次数,默认为1
  # weight 为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
  # backup 热备(其它所有的非backup机器down或者忙的时候,请求backup机器))
  upstream myServer{
        server  192.168.247.129:8080  max_fails=3  weight=2;
        server  192.168.247.129:8081  max_fails=3  weight=4;
        server  192.168.247.129:8082  backup;
  }

  # *****https配置*****
  #可配置在server块中
  # 下面是配置生产环境中既支持 HTTP 又支持 HTTPS, 保证用户在浏览器中输入 HTTP 也能正常访问
  # SSL证书 配置
  # 加密证书路径
  ssl_certificate  cert/yphtoy.com.pem;
  #加密私钥路径
  ssl_certificate_key  cert/yphtoy.com.key;
  #加密协议
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  #加密访问缓存设置,可以大大提高访问速度
  ssl_session_cache  shared:SSL:1m;
  #加密访问缓存过期时间
  ssl_session_timeout  10m;
  #加密算法
  ssl_ciphers  HIGH:!aNULL:!MD5;
  #是否由服务器决定采用哪种加密算法
  ssl_prefer_server_ciphers  on;

  server{
    # server 配置块
  }
}

server

nginx中,一个server块代表了一个虚拟机主机

server {
        listen       8080;
        server_name  localhost;
        access_log  logs/host.access.log  main;

        location / {
            #location 配置块
        }
    }
  • listennginx通过listen指令指定的值监听网络请求;如果不设置listen指令,nginx在超级用户root运行时监听80端口,以非超级用户运行时则监听8080端口。listen 指令的指令值还针对监听方式提供了丰富的参数。
    • address:若为 IP 协议,该参数值为指定绑定监听端口的 IP 或主机名;若为 UNIX 域套接字,则该参数值为 sock 文件路径,默认值 --
    • port:IP协议监听的端口,默认值 80
    • bind:指定 IP 及端口,默认值 address:port
    • ipv6only:只接收 IPv6 连接或接收 IPv6 和 IPv4 连接,默认值 on
    • default_server:当 http 指令域中包含多个虚拟主机时,该参数用于指定哪个虚拟主机是默认服务,默认将第一个顺序的 server 设为默认服务。默认服务可以用来处理没有 server_name 匹配成功的请求,默认值 --
    • http2:HTTP/2 协议支持,默认值 --
    • spdy:SDPY 协议支持,与 HTTP/2 协议不能同时存在,默认值 --
    • ssl:SSL支持
    • proxy_protocol:在指定监听端口上启用 proxy_protocol 协议支持,默认值 --
    • fastopen:HTTP 处于保持连接(keepalive)状态时,允许不经过三次握手的 TCP 连接的队列的最大数,默认值 number
    • deferred:添加该参数后,在 TCP 三次握手的过程中,检测到客户端有数据时才将 TCP 状态置为 ESTABLISHED 状态,没有数据则直接丢弃,默认值 --
    • reuseport:默认情况下,所有的工作进程会共享一个 socket 去监听同一 IP 和端口的组合。该参数启用后,允许每个工作进程有独立的 socket 去监听同一 IP 和端口的组合,内核会对传人的连接进行负载均衡。适用于 Linux 3.9+,DragonFly BSD 和 FreeBSD 12+,默认值 --
    • so_keepalive:配置是否在监听的端口启用“TCP keepalive”机制。当设置为 on 时,默认等同于 so_keepalive=30m::10,表示 30 分钟无数据传输时发送探测包,发送 10 次,发送间隔使用系统内核参数 tcp_keepalive_intvl 的设定值,默认值 off
    • backlog:当阻塞时,设置挂起连接队列的最大长度,在 FreeBSD,DragonFly BSD 和 MacOS 操作系统上,默认值为 -1,其他平台上值为 511,默认值 -1/511
    • rcvbuf:socket 接收缓冲的大小,默认为 8k 字节,在接收数据比较大的场景中可以适当调整,默认值 --
    • sndbuf:socket 发送缓冲的大小,默认为 8k 字节,在发送数据较大的场景中可以适当调整,默认值 --
    • setfib:为监听套接字设置关联路由表,仅在 FreeBSD 系统上有效,默认值 number
    • accept_filter:为监听套接字设置过滤器,仅支持 FreeBSD 和 NetBSD 5.0+ 系统,默认值 filter
 server {
        listen 127.0.0.1:8000;           # 监听127.0.0.1的8000端口
        listen 127.0.0.1;                # 监听127.0.0.1的默认80端口(root权限)
        listen 8000;                     # 监听本机所有IP的8000端口
        listen 443 ssl;									 # 监听443端口,开启ssl支持
        listen *:8000;                   # 监听本机所有IP的8000端口
        listen localhost:8000;           # 监听locahost的8000端口
        listen [::]:8000;                # 监听IPv6的8000端口
        listen [::1];                    # 监听IPv6的回环IP的默认80端口(root权限)
        listen unix:/var/run/nginx.sock; # 监听域套接字文件
        listen *:8000 \                  # 监听本机的8000端口
                default_server \         # 当前服务是http指令域的主服务
                fastopen=30 \            # 开启fastopen功能并限定最大队列数为30
                deferred \               # 拒绝空数据连接
                reuseport \              # 工作进程共享socket这个监听端口
                backlog=1024 \           # 请求阻塞时挂起队列数是1024个
                so_keepalive=on;         # 当socket为保持连接时,开启状态检测功能
    }
  • server_name:主要用与配置基于名称的虚拟主机,server_name 指令在接到客户请求后的匹配顺序分别为。
    • 准确的server_name匹配
server {
     listen       80;
     server_name  xxx.com  www.xxx.com;
     ...
}
    • *通配符开始的字符串
server {
     listen       80;
     server_name  *.xxx.com;
     ...
}
    • *通配符结束的字符串
server {
     listen       80;
     server_name  www.*;
     ...
}
    • 匹配正则表达式
server {
     listen       80;
     server_name  ~^(?.+)\.xxx\.com$;
     ...
}
  • access_log:指定日志存放路径、格式和缓存大小,access_log off关闭日志