1. NGINX配置单域名反向代理(以Centos 7为例)
- NGINX配置文件路径 /etc/nginx/nginx.conf
- 重新载入配置 nginx -s reload
- nginx.conf示例(相关参数释义见#开头的注释):
[root@VM-0-11-centos nginx]# vi /etc/nginx/nginx.conf
#事件模块,worker_connections定义每个worker进程连接数量,通常设置为1024
events {
worker_connections 1024;
}
#http模块,即反向代理配置
http{
client_max_body_size 4096m;
sendfile on;
tcp_nopush on;
proxy_request_buffering off;
#upstream配置,用于配置第一个需要反向代理的http服务,并命名为site1,其中server 填入http服务的本地IP和端口,如常用的127.0.0.1:80,即开放本机80端口到site1代理
upstream site1 {
server 127.0.0.1:80
}
#80端口server配置,server_name填入已解析的域名,如domain_name1, location填入上述配置好的upstream,proxy_pass即域名domain_name1的80端口访问请求代理至site1服务,此时访问http://domain_name1即可获得site1的http服务。此外,我们一般都会为主域名配置ssl证书,此时我们需要将80端口的http访问rewrite成443端口的http访问,此时访问http://domain_name1将会自动rewrite成https://domain_name1,可以理解为强制ssl访问,permanent参数可以让浏览器记住该rewrite选项。
server {
listen 80;
server_name domain_name1;
location / {
proxy_pass http://site1;
}
rewrite ^/(.*) https://domain_name1/$1 permanent;
}
#443端口server配置,server_name和location与80端口一致,额外配置domain_name1的证书和私钥,提前将相应文件保存至/etc/nginx/文件夹中。
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name domain_name1;
#证书文件名称
ssl_certificate domain_name1_bundle.crt;
#私钥文件名称
ssl_certificate_key domain_name1.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://site1;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#上述两个server配置了http://domain_name1和https://domain_name1的反向代理,但是我们域名解析的时候往往会同时添加www.domain_name1的解析,因此带www前缀的域名还需要额外配置80和443端口的反向代理,并将带www前缀的访问请求rewrite成不带www带简洁样式。此时,4种访问结果都将导向唯一的https://domain_name1网址。
server {
listen 80;
server_name www.domain_name1;
location / {
proxy_pass http://site1;
}
rewrite ^/(.*) https://tguo.top/$1 permanent;
}
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name domain_name1;
#证书文件名称
ssl_certificate domain_name1_bundle.crt;
#私钥文件名称
ssl_certificate_key domain_name1.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://site1;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
rewrite ^/(.*) https://domain_name1/$1 permanent;
}
}
2. 多域名多ssl反向代理
有时候我们一台服务器不止跑一个http服务,并且拥有多个域名,毕竟普通域名十分便宜,此时可以利用NGINX实现单公网ip的80,443端口复用,用于多域名解析,并且能够支持多ssl。但是一定要为每个域名及其子域名的80(http://domain_name)和443(https://domain_name)访问单独配置反向代理,否则会出现A域名解析到B域名服务上的情况。具体配置可参照上述upstream
和server
配置示例。
多ssl证书的支持取决于安装的openssl版本
- 检查NGINX是否支持TLS
# nginx -V
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1g FIPS 21 Apr 2020 (running with OpenSSL 1.1.1k FIPS 25 Mar 2021)
TLS SNI support enabled
configure arguments:
- 如果出现
TLS SNI support disable
,请升级openssl。
3. 通过frp实现公网ip的复用,低成本搭建高负载http服务
WIP