Nginx

Nginx 的常用配置,包括静态文件代理、Stream流代理、服务地址反向代理、负载均衡、跨域、证书

作用

  • 静态资源服务

  • http/https 代理

  • stream 代理

  • 负载均衡


常用命令

1
2
3
4
5
6
7
8
# 启动
nginx
# 停止
nginx -s stop 
# 安全退出
nginx -s quit
# 重新加载配置文件
nginx -s reload

基础配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    # 负载均衡
    upstream testsite {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }

    server {
        listen       80;
        server_name  localhost;

        # 注意:"\"会和字母形成转义符,只能用 "\\" 或者 "/" 代表路径层级的分隔符

        # 反向代理
        location /testproxy/ {
            # proxy_pass 最后带斜杠,则将 location 完全替换为 proxy_pass
            proxy_pass http://127.0.0.1:8080/;

            # proxy_pass 最后不带斜杠,则将 location 和 proxy_pass 进行拼接
            # proxy_pass http://127.0.0.1:8080;

            # 注: 反向代理中可以添加重定向去做动静分离
        }

        # 静态文件代理
        location /test/ {
            # 文件的路径会拼接 location,下面的会变成 D:/Tools/nginx/conf/test/
            # root D:/Tools/nginx/conf/;      

            # alias 的路径便是文件路径
            alias D:/Tools/nginx/conf;    

            # 一般设置需要 location 和 alias 都带斜杠或都不带
            
            # 在网页上列出对应文件夹下的文件列表
            autoindex on;
        }

        # 对应负载均衡的反向代理,这里 proxy_pass 的 testsite 与 upstream 的 testsite 保持一致
        location /test2/ {
            proxy_pass http://testsite/;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }

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

Stream代理

流量代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 代理127.0.0.1的3389端口到7000端口(可用于代理远程桌面)
stream {
    server{
        listen 7000;
        proxy_pass 127.0.0.1:3389;
        # 连接超时
        proxy_connect_timeout 8s;
        # 代理服务器超时
        proxy_timeout 24h;
    }
}

负载均衡

只列出了常用的轮询、权重、ip哈希三种方式,另外还有最少连接、随机、加权随机等。

注:配置放在根节点,与server一级

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 轮询法
upstream gear-server {
    server 127.0.0.1:9001;    
    servr 127.0.0.1:9002;
}

# 权重法
upstream gear-server {
    server 127.0.0.1:9001 weight=1;
    server 127.0.0.1:9002 weight=2;
    server 127.0.0.1:9003 weight=1;
}

# ip哈希(会根据ip绑定访问同一服务器),比权重法多了个ip_hash
upstream gear-server {
    ip_hash;
    server 127.0.0.1:9001 weight=1;
    server 127.0.0.1:9002 weight=2;
    server 127.0.0.1:9003 weight=1;
}

Https配置(自定义证书)

OpenSSL下载:/source/index.html (openssl.org)

官网不提供 windows 版本下载。可搜索第三方提供的。此处采用的是 git 自带的(路径:C:\Program Files\Git\mingw64\bin

(1)生成 RSA 秘钥

1
2
#实际使用中看服务器性能,如果足够好也可以使用4096位秘钥
openssl genrsa -out nginx.pem 1024  

(2)生成证书请求

1
2
# 注意,Common Name 应当填写你要部署的域名,或使用*,对所有mydomain.com的子域名做认证
openssl req -new -key nginx.pem -out nginx.csr

(3)签发证书

1
openssl x509 -req -days 36500 -in nginx.csr  -signkey nginx.pem -out nginx.crt

(4)配置 nginx

nginx 一般都自带有 ssl 的支持

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 在 server 节点添加如下内容
server {    ...    listen       443 ssl;
    server_name  test.mydomain.com;   #与申请时的域名保持一致,否则会报错

    ssl_certificate "/etc/nginx/ssl/nginx.crt";   #
    ssl_certificate_key "/etc/nginx/ssl/nginx.pem";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    ...}

(5)重新载入 nginx

1
nginx -s reload

跨域配置

  1. 配置在 server 节点下,该端口的 url 跨域访问均放行;
  2. 配置在 location 节点下,该前缀的 url 跨域访问均放行;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';
add_header 'Access-Control-Allow-Headers' *;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain; charset=utf-8';
    add_header 'Content-Length' 0;
    # 对于Options方式的请求返回204,表示接受跨域请求
    return 204;
}
Licensed under CC BY-NC-SA 4.0
Comments
  • Latest
  • Oldest
  • Hottest
No comment yet.
Powered by Waline v2.15.8
Gear(夕照)的博客。记录开发、生活,以及一些不足为道的思考……