梦想博客

Nginx备忘录

calendar 2023/08/11
refresh-cw 2023/08/11
1967字,4分钟

Nginx使用说明 🔗

在一些情况下,有些nginx的配置实在是想不起来..所以写一篇博客来记录一下常用的方法

此博客仅说明在linux下的nginx(1.25.1)配置,至于windows不做说明,因为windows下的nginx存在问题

最基础的使用方法这里也不做过多赘述

本文部分地方借鉴了其他的文章

日志配置 🔗

变量 含义
$bytes_sent 发送给客户端的总字节数
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小
$connection 连接序列号
$connection_requests 当前通过连接发出的请求数量
$msec 日志写入时间,单位为秒,精度是毫秒
$pipe 如果请求是通过http流水线发送,则其值为"p",否则为“."
$request_length 请求长度(包括请求行,请求头和请求体)
$request_time 请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送到客户端进行日志写入为止
$status 响应状态码
$time_iso8601 标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”
$time_local 通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800"
$http_referer 请求的referer地址
$http_user_agent 客户端浏览器信息
$remote_addr 客户端IP
$remote_port 客户端端口
$host host信息
$http_x_forwarded_for 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置
$request 完整的原始请求行,如 “GET / HTTP/1.1”
$remote_user 客户端用户名称,针对启用了用户认证的请求
$request_uri 完整的请求地址,如 “https://dreamogi.com/"

Conf配置文件 🔗


不知在什么版本开始,nginx支持了conf.d文件夹,这样有一个好处,即每个域名单独配置一个conf文件,再也不用都塞到nginx.conf中了

用于80端口重定向到443(http强制https) 🔗

server {
    listen 80;
    listen [::]:80;
    server_name ;
    return 301 https://$server_name$request_uri;
}

SSL证书 🔗

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 10m;
ssl_buffer_size 1400;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
ssl_certificate ;
ssl_certificate_key ;

http2支持 🔗

http2 on;

如果是版本1.24以下的话只需要在listen后加http2即可

请求体大小 🔗

client_max_body_size 100m;

TCP/UDP反向代理 🔗

stream{
     #tcp
        upstream loginserver_android{
         #ip_hash;
          server localhost:6001 max_fails=1 fail_timeout=10s;
          server localhost:6002 max_fails=1 fail_timeout=10s;
          server localhost:6003 max_fails=1 fail_timeout=10s;
         #server localhost:6004 max_fails=1 fail_timeout=10s;
         #server localhost:6005 max_fails=1 fail_timeout=10s;
         #server localhost:6006 max_fails=1 fail_timeout=10s;
        }
        upstream loginserver_ios{
         #ip_hash;
         # server localhost:6001 max_fails=1 fail_timeout=10s;
         # server localhost:6002 max_fails=1 fail_timeout=10s;
         # server localhost:6003 max_fails=1 fail_timeout=10s;
         server localhost:6004 max_fails=1 fail_timeout=10s;
         server localhost:6005 max_fails=1 fail_timeout=10s;
         server localhost:6006 max_fails=1 fail_timeout=10s;
        }
        server {
            listen 6020;
            proxy_connect_timeout 5s;
            proxy_timeout 10m;
            ###proxy_timeout 24h;
              ###这个参数在使用EMQ压力测试时很有用,刚开始设备的超时时间过段,导致测试一小会儿就出现 {shutdown,connack_timeout}
             proxy_pass loginserver_ios;
        }

        server {
            listen 6000;
            proxy_connect_timeout 5s;
            proxy_timeout 10m;
            ###proxy_timeout 24h;
              ###这个参数在使用EMQ压力测试时很有用,刚开始设备的超时时间过段,导致测试一小会儿就出现 {shutdown,connack_timeout}
             proxy_pass loginserver_android;
        }
}

# udp
stream {
  upstream dns_upstreams {
    server 192.168.136.130:53;
    server 192.168.136.131:53;
  }

  server {
    listen 53 udp;
    proxy_pass dns_upstreams;
    proxy_timeout 1s;
    proxy_responses 1;
    error_log logs/dns.log;
  }
}

Http反向代理 🔗

proxy_pass http://localhost:5000;
proxy_redirect off;

动静分离 🔗

location ~* \.(ini|list)$ {

    }

负载均衡 🔗

Nginx的负载均衡策略一共有5种,分别是

  • 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

  • 权重(weight)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream Servers {
  server localhost:8087 weight=10;
  server localhost:8088 weight=2;
  server localhost:8089;
}

location / {
  proxy_pass http://Servers; // Servers为自己定义的服务器集群
}	
  • Session一致性(ip_hash)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}
  • fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}
  • url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

proxy_pass http://backserver/; 
upstream backserver{ 
    ip_hash; 
    server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载) 
    server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
} 
1max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
2fail_timeout:max_fails次失败后,暂停的时间

使用logrotate实现Nginx日志切割和日志分析 🔗

位于 /etc/logrotate.d/ 路径下的nginx文件

/var/log/nginx/*.log {
  daily
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  create 640 nginx adm
  dateext
  dateformat .%Y-%m-%d
  sharedscripts
  postrotate
          if [ -f /var/run/nginx.pid ]; then
                  kill -USR1 `cat /var/run/nginx.pid`
          fi
  endscript
}

即代表每天执行一次,保存52天前的旧日志。并压缩

红蓝发布 🔗

待填坑

限制Region访问 🔗

需要在下载Nginx源码,并在编译时–with-http_geoip_module,加入geoip

限制单个IP或者某个IP段:deny 192.168.0.104; 允许单个IP或者某个IP段:allow 192.168.0.104;

常见问题 🔗

  • 为什么windows下使用nginx -s reload后配置不生效?

在nginx官方文档中有关于此问题的隐晦描述:Although several workers can be started, only one of them actually does any work。

解决方案:停止所有nginx进程,并重新启动 taskkill /IM nginx.exe /F


分类