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机器)
}
使用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