Nginx 入门实战(2)--简单使用
本文主要介绍 Nginx 的实际使用,文中所使用到的软件版本:Centos 7.9.2009、Nginx 1.22.1。
1、环境准备
这里主要演示使用 Nginx 代理 Http 及 TCP 应用,环境信息如下:
主机 | 用途 | Http 端口 | TCP 端口 |
10.49.196.30 | 部署 Http、TCP 应用 | 8080 | 9090 |
10.49.196.31 | 部署 Http、TCP 应用 | 8080 | 9090 |
10.49.196.33 | 部署 Nginx |
2、Http 应用
配置代理时都新建新的配置文件 conf/http.conf,然后在主配置文件 conf/nginx.conf 中引入该文件:
http {
include mime.types;
default_type application/octet-stream;
...
include http.conf;
...
}
2.1、普通代理
server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location /myapp { proxy_pass http://10.49.196.30:8080/myapp; } location / { proxy_pass https://www.baidu.com; } }
代理地址为:http://10.49.196.33:8081/myapp,被代理地址为:http://10.49.196.30:8080/myapp;根地址代理百度网站。
2.2、负载均衡
upstream cluster { server 10.49.196.30:8080 weight=1; server 10.49.196.31:8080 weight=1; round-robin; } server { listen 8082; server_name localhost-8082; access_log logs/access-8082.log; location /myapp { proxy_pass http://cluster/myapp; } }
Nginx 支持三种负载均衡算法:
- round-robin:轮询(默认算法)
- least-connected:下一个请求将分配给当前拥有最少活跃连接数的服务器,对应的 Nginx 指令为 least_conn
- ip-hash:同一 ip 的请求分配到同一个服务器,对应的 Nginx 指令为 ip_hash
Nginx 还支持通过指定服务器的权重(weight) 来影响负载均衡算法,上面的配置意味着两台服务器在特定负载均衡算法上具有相同的资格。
2.3、配置文件服务器
server { listen 8083; server_name localhost-8083; access_log logs/access-8083.log; location / { autoindex on; autoindex_exact_size on; autoindex_localtime on; charset utf-8; root /mnt/centos7; } }
2.4、启用 Nginx Status
server { listen 8083; server_name localhost-8083; access_log logs/access-8083.log; location /nginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; } ... }
2.4、限流
2.4.1、限制访问频率
limit_req_zone $binary_remote_addr zone=peripZone:10m rate=100r/m; server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location /myapp { limit_req zone=peripZone burst=5 nodelay; proxy_pass http://10.49.196.30:8080/myapp; } }
limit_req_zone 定义了一个名为 peripZone 的共享内存区域,大小为 10M,最大访问速率为:每分钟 100 个请求;该区域以“客户端地址”为 key 来保存状态信息。
limit_req 设置使用的共享内存区域,burst 定义了过量请求的缓存队列大小,超过访问速率的请求将保存该队列中;如果缓存队列也慢了将直接返回 503;nodelay 表示缓存队列中请求将不会被延迟处理(虽然超过了请求速率,缓存队列中请求也立即被处理),也可通过 delay=number 来设置缓存队列中请求被延迟处理的个数。
2.4.2、限制并发连接数
limit_conn_zone $server_name zone=perserverZone:10m; server { listen 8081; server_name localhost-8081; access_log logs/access-8081.log; location /myapp { limit_conn perserverZone 5; proxy_pass http://10.49.196.30:8080/myapp; } }
limit_conn_zone 定义了一个名为 perserverZone 的共享内存区域,大小为 10M;该区域以“虚拟服务器名称”为 key 来保存状态信息。
limit_conn 设置使用的共享内存区域,并定义最大并发连接数。
2.5、配置 Https
2.5.1、生成证书
启用 Https,需要使用 OpenSSL 创建证书。
A、生成根证书
openssl genrsa -out ca.key openssl req -new -key ca.key -out ca.csr openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.pem
B、生成服务端证书
openssl genrsa -out server.key openssl req -new -key server.key -out server.csr openssl ca -days 3650 -in server.csr -cert ca.pem -keyfile ca.key -out server.pem
C、生成客户端证书
openssl genrsa -des3 -out client.key 1024 openssl req -new -key client.key -out client.csr openssl ca -days 1500 -in client.csr -cert ca.pem -keyfile ca.key -out client.pem openssl pkcs12 -export -clcerts -in client.pem -inkey client.key -out client.p12
使用 OpenSSL 创建证书的详细说明可参考:OpenSSL 介绍(5)--数字证书;这里生成的证书假设都存放在 /home/mongo/ssl 目录下。
2.5.2、Nginx 中配置 Https
server { listen 4430 ssl; server_name localhost-8084; access_log logs/access-8084.log; ssl_certificate /home/mongo/ssl/server.pem; ssl_certificate_key /home/mongo/ssl/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_client_certificate /home/mongo/ssl/ca.pem; ssl_verify_client on; location /myapp { proxy_pass http://10.49.196.30:8080/myapp; } }
上述配置开启了客户端验证,客户端访问时需要使用客户端证书(client.p12)来访问;浏览器访问导入该证书即可,Java 客户端的访问可参考:Java调用Http/Https接口(2)--HttpURLConnection/HttpsURLConnection调用Http/Https接口。如果不需要客户端验证,注释掉如下配置即可:
ssl_client_certificate /home/mongo/ssl/ca.pem;
ssl_verify_client on;
3、TCP 应用
配置代理时都新建新的配置文件 conf/tcp.conf,然后在主配置文件 conf/nginx.conf 最后该文件:
...
include tcp.conf;
3.1、普通代理
stream { server { listen 9090; proxy_pass 10.49.196.30:9090; } }
代理地址为:10.49.196.33:9090,被代理地址为:10.49.196.30:9090。
3.2、负载均衡
stream { upstream tcp3031 { server 10.49.196.30:9090; server 10.49.196.31:9090; } server { listen 9091; proxy_pass tcp3031; } }