Ting
发布于 2022-09-08 / 207 阅读
0

NGINX配置反向代理以及通过frp实现公网ip的复用

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域名服务上的情况。具体配置可参照上述upstreamserver配置示例。

多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