喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

Nginx常见配置以及问题解决

本文记录了 Nginx 常用配置 以及 在配置过程中遇到的问题

常用配置

不同协议配置

1
2
3
server {
listen 80;
}
  • HTTP listen 80
  • HTTPS listen 443 ssl
  • UDP listen 85 udp

配置HTTPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
listen 80;
listen 443;
ssl on;
ssl_certificate /home/ssl/fullchain.pem; #或者fullchain.crt fullchain.cer
ssl_certificate_key /home/ssl/privkey.pem; #或者privkey.key
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
ssl_session_cache builtin:1000 shared:SSL:10m;

if ($scheme != "https"){ return 497; }
#由于上面开启强制 ssl 所以会产生 497 错误 这个错误重定向到 443 端口
error_page 497 https://$host$request_uri;

# 或者直接用rewrite重定向
if ($scheme != "https"){ rewrite ^.*$ https://$host$request_uri permanent; }

下载速度限制

1
2
3
4
location / {
limit_rate_after 10m;
limit_rate 512k;
}

反向代理配置

1
2
3
4
5
6
7
8
9
10
location / {
proxy_pass http://localhost:8081; # 代理转发的地址
proxy_set_header Host $host; # 代理转发HOST
proxy_set_header X-Real-IP $remote_addr; # 代理转发远程IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理转发途经IP
proxy_set_header X-Forwarded-Proto $scheme; # 代理转发协议
proxy_connect_timeout 300s; # 代理连接超时
proxy_read_timeout 300s; # 代理读取超时
proxy_send_timeout 300s; # 代理发送超时
}

URL重写到 index.php

  • 文件测试模式

    1
    try_files $uri $uri/ /index.php?$uri&$args;
  • 文件名称判断

    1
    2
    3
    if (!-e $request_filename) {
    rewrite (.*) /index.php last;
    }
  • 重写目录和文件

    1
    2
    3
    4
    5
    6
    if (!-d $request_filename) {
    rewrite ^/(.+)/$ /$1 permanent;
    }
    if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?/$1 last;
    }

允许跨域访问

1
2
3
add_header Access-Control-Allow-Headers x-requested-with,content-type;
add_header Access-Control-Allow-Methods POST,GET;
add_header Access-Control-Allow-Origin *;

取消iframe跨域安全限制(IE上有这个问题)

1
add_header P3P "CP=CAO PSA OUR";

开启目录

1
2
3
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;

解决中文乱码

1
charset utf-8,gbk;

上传大小配置

1
client_max_body_size 50M;

配置 GZIP 压缩

1
2
3
4
5
6
7
8
gzip on;
gzip_static on;
gzip_min_length 1024; # GZIP 最小压缩长度 只有大于这个长度才会被 gzip
gzip_buffers 4 16k;
gzip_comp_level 3; # GZIP 压缩等级
gzip_types application/json text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #开启GZIP的类型
gzip_vary on;
gzip_disable "MSIE [1-6]\."; #取消IE上的gzip因为不支持

WebSocket代理设置

1
2
3
4
5
6
location /ws/ {
proxy_pass http://wsbackend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

上游服务器设置

1
2
3
4
5
6
upstream wsbackend {
hash $remote_addr consistent; #哈希一致性
server 127.0.0.1:8010; #正常代理
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; #最大失败次数3 失败超时30秒
server unix:/tmp/backend3; # Unix网络连接
}

关闭非法头部过滤(用于带有特殊头部的系统请求)

1
ignore_invalid_headers off;

设置为 root 用户启动

1
user root root;

常见问题

  • 配置文件提示 could not build the server_names_hash, you should increase server_names_hash_bucket_size: xx
    • 原因: 由于哈希表大小不足以存储服务器别名
    • 解决方案: 配置文件 http{...} 添加一行配置 server_names_hash_bucket_size 64;

欢迎关注我的其它发布渠道