Skip to content

Nginx 笔记

指令

Nginx 重新读取配置的命令 nginx -s reload

gzip 压缩

nginx
http {
  gzip  on;
  gzip_types application/javascript application/json text/css text/xml font/woff;
  gzip_disable "MSIE [1-6]\.";
}
http {
  gzip  on;
  gzip_types application/javascript application/json text/css text/xml font/woff;
  gzip_disable "MSIE [1-6]\.";
}

location

语法规则: location [=|~|~*|^~] /uri/ { ... }

= 开头表示精确匹配

^~ 开头表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

!~!~* 分别为区分大小写不匹配及不区分大小写不匹配的正则

/ 通用匹配,任何请求都会匹配到。

nginx 反向代理

nginx
server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    ssl_certificate "/root/ssl/xxx.pem";
    ssl_certificate_key "/root/ssl/xxx.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;

    ## Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location /carwechat/ {
        proxy_pass http://192.168.1.5:3002/carwechat/;
        proxy_redirect off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}
server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

    ssl_certificate "/root/ssl/xxx.pem";
    ssl_certificate_key "/root/ssl/xxx.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;

    ## Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location /carwechat/ {
        proxy_pass http://192.168.1.5:3002/carwechat/;
        proxy_redirect off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

nginx 权重分配

weight

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

nginx
upstream backend {
  server 192.168.0.14 weight=10;
  server 192.168.0.15 weight=10;
}
upstream backend {
  server 192.168.0.14 weight=10;
  server 192.168.0.15 weight=10;
}

ip_hash

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

nginx
upstream backend {
  ip_hash;
  server 192.168.0.14:88;
  server 192.168.0.15:80;
}
upstream backend {
  ip_hash;
  server 192.168.0.14:88;
  server 192.168.0.15:80;
}

fair(第三方)

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

nginx
upstream backend {
  server server1.linuxany.com;
  server server2.linuxany.com;
  fair;
}
upstream backend {
  server server1.linuxany.com;
  server server2.linuxany.com;
  fair;
}

url_hash(第三方)

按访问 urlhash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。 例:在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用的 hash 算法。

nginx
upstream backend {
  server squid1:3128;
  server squid2:3128;
  hash $request_uri;
  hash_method crc32;
}
#定义负载均衡设备的Ip及设备状态
upstream backend{
  ip_hash;
  server 127.0.0.1:9090 down;
  server 127.0.0.1:8080 weight=2;
  server 127.0.0.1:6060;
  server 127.0.0.1:7070 backup;
}
upstream backend {
  server squid1:3128;
  server squid2:3128;
  hash $request_uri;
  hash_method crc32;
}
#定义负载均衡设备的Ip及设备状态
upstream backend{
  ip_hash;
  server 127.0.0.1:9090 down;
  server 127.0.0.1:8080 weight=2;
  server 127.0.0.1:6060;
  server 127.0.0.1:7070 backup;
}

在需要使用负载均衡的 server 中增加 proxy_pass http://bakend/;

每个设备的状态设置为:

  1. down 表示单前的 server 暂时不参与负载
  2. weight 默认为 1 weight 越大,负载的权重就越大。
  3. max_fails:允许请求失败的次数默认为 1 当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
  4. fail_timeout:max_fails 次失败后,暂停的时间。
  5. backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。

nginx 正向代理

nginx 不仅可以来做反向代理,也可以用来做正向代理(透明代理,代理上网)

nginx
http {
  resolver 8.8.8.8;
  server {
    listen 8088;
    location / {
      proxy_pass http://$http_host$request_uri;
    }
  }
}
http {
  resolver 8.8.8.8;
  server {
    listen 8088;
    location / {
      proxy_pass http://$http_host$request_uri;
    }
  }
}

nginx 实现代理上网,有三个关键点必须注意,其余的配置跟普通的 nginx 一样

  1. 增加 dns 解析 resolver
  2. 增加无 server_name 名的 server
  3. proxy_pass 指令

HTTP 强制转 HTTPS

使用 497 状态

497 - normal request was sent to HTTPS

解释:当网站只允许 https 访问时,当用 http 访问时 nginx 会报出 497 错误码。

思路:

利用 error_page 命令将 497 状态码的链接重定向到 https://demo.com 这个域名上。

配置方式:

nginx
server {
    listen       443 ssl;  ## ssl 端口
    listen       80;   ## 用户习惯用 http 访问,加上80,后面通过 497 状态码让它自动跳到 443 端口
    server_name  demo.com;
    ssl on;
    ## 指定 PEM 格式的证书文件
    ssl_certificate      /etc/nginx/certificate.pem;
    ## 指定 PEM 格式的私钥文件
    ssl_certificate_key  /etc/nginx/certificate.key;
    ## 让 http 请求重定向到 https 请求
    error_page 497 https://$host$uri?$args;

    gzip on;
    gzip_buffers 32 4k;
    gzip_comp_level 6;
    gzip_min_length 200;
    gzip_types text/css text/xml application/javascript;
    gzip_vary on;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host  $http_host;
        proxy_pass http://localhost:2368;
    }
}
server {
    listen       443 ssl;  ## ssl 端口
    listen       80;   ## 用户习惯用 http 访问,加上80,后面通过 497 状态码让它自动跳到 443 端口
    server_name  demo.com;
    ssl on;
    ## 指定 PEM 格式的证书文件
    ssl_certificate      /etc/nginx/certificate.pem;
    ## 指定 PEM 格式的私钥文件
    ssl_certificate_key  /etc/nginx/certificate.key;
    ## 让 http 请求重定向到 https 请求
    error_page 497 https://$host$uri?$args;

    gzip on;
    gzip_buffers 32 4k;
    gzip_comp_level 6;
    gzip_min_length 200;
    gzip_types text/css text/xml application/javascript;
    gzip_vary on;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host  $http_host;
        proxy_pass http://localhost:2368;
    }
}

使用 rewrite

nginx
server {
    listen       80;
    server_name  _;
    rewrite ^(.*)$ https://$host$1 permanent;
}
server {
    listen       80;
    server_name  _;
    rewrite ^(.*)$ https://$host$1 permanent;
}

开启 Nginx 文件目录页面

打开 nginx.conf 文件,在 location serverhttp 段中加入 autoindex on;

另外两个参数最好也加上去:autoindex_exact_size on;

显示出文件的确切大小,单位是 bytes

改为 off 后,显示出文件的大概大小,单位是 kB 或者 MB 或者 GB

autoindex_localtime on;

默认为 off,显示的文件时间为 GMT 时间。

改为 on 后,显示的文件时间为文件的服务器时间

配置 Nginx 目录列表的方法详细参照:这个

配置示例:

nginx
location /upload {
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
    alias F:\\PHP\\upload;
}
location /upload {
    autoindex on;
    autoindex_exact_size on;
    autoindex_localtime on;
    alias F:\\PHP\\upload;
}

nginx stream 代理数据库链接

这个特性应该是 1.14.2 版本新增的

nginx
stream {
	## mysql
    server {
        listen  4000;  //本地请求端口
        proxy_pass ***.***.***.***:***;  //转发到服务器的地址
    }
	## redis
	server {
        listen  4001;
        proxy_pass ***.***.***.***:***;
    }
	## mongdb
	server {
        listen  4002;
        proxy_pass ***.***.***.***:***;
    }
}
stream {
	## mysql
    server {
        listen  4000;  //本地请求端口
        proxy_pass ***.***.***.***:***;  //转发到服务器的地址
    }
	## redis
	server {
        listen  4001;
        proxy_pass ***.***.***.***:***;
    }
	## mongdb
	server {
        listen  4002;
        proxy_pass ***.***.***.***:***;
    }
}

最后编辑时间:

Version 4.0 (framework-1.0.0-rc.20)