本文默认只有一台服务器,且已经安装了 Nginx。
那么现在,就可以按步骤进行操作了。
注:关于 Nginx 更详细的安装步骤和介绍,可以参考文章:Linux nginx的安装与入门
注:本文只是一个场景示例,不必纠结于生产实际是否长这样。
配置防火墙
在正式配置 反向代理 之前,我们需要确保 Nginx要监听的端口是对外开放的(例如HTTPS默认端口443)。
此时,我们应该想到的第一件事,就是——防火墙。
以下是防火墙的管理命令简单示例,更复杂的请借助搜索引擎:
Ubuntu查看防火墙信息(允许访问的端口信息),命令:sudo ufw status
Ubuntu允许外部访问端口(以443为例):sudo ufw allow 443
Ubuntu删除增加的规则(以443为例):sudo ufw delete allow 443
如果是云服务器,则还要保证 安全组 配置了 Nginx要监听的端口允许外部访问!!!
注:由于不同云服务商的操作步骤不同,所以这不做安全组配置的展示。
如果是阿里云服务器,可以参考这篇文章:云服务器的入门配置及SSH连接(基于阿里云服务器)
如果是华为云服务器,可以参考这篇文章:云服务器的入门配置及SSH连接(基于华为云服务器)
正常启动应用服务
怎么启动你的应用服务不是本文内容,所以不进行说明。
不过,不管怎样,此时你应该要明确这几件事:
如果反向代理的是静态文件(如前后端分离项目的前端静态文件),则文件路径是在哪
如果反向代理的是一个服务(比如运行的JAR包服务),则这个服务监听的端口是什么,比如SpringBoot项目常见的8080端口。(被代理的端口不必允许外部访问)
Nginx代理配置(HTTP)
进入到nginx的配置文件路径:cd /etc/nginx/conf.d/
编辑生成一个新的配置文件:vi xxx.conf
注:配置文件的文件名请自定义。
注:下面配置仅为示例,可以自行补充扩展,以及注意IP地址、域名、静态文件访问路径 要改成正确的。
注:关于 Nginx 更详细的介绍,可以参考文章:Linux nginx的安装与入门
静态文件时配置文件内容如下:
server {
# HTTP默认访问80端口
listen 80;
# IPv6地址格式,这里忽略
# listen [::]:80;
server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址
location / {
root /path/dist; # 请求的根路径,即虽然可能请求时只输入了 IP:Port/ , 但是最终Nginx处理时会变成 IP:Port/path/dist/
index index.html index.htm; # 定义索引文件,即如果路径只输入到/,则内部会重定向加载index匹配到的文件
}
# 定义发生特定错误时给访问者展示的页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
代理服务时配置文件内容如下:
server {
# HTTP默认访问80端口
listen 80;
# IPv6地址格式,这里忽略
# listen [::]:80;
server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址
# on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
underscores_in_headers on;
charset utf-8;
# 设置客户端请求body的最大允许大小,默认1m
client_max_body_size 100m;
# 内部进行转发
location / {
proxy_pass http://127.0.0.1:8080; # 转发到服务器内部真正处理业务的服务监听的端口
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;
}
}
执行nginx校验配置文件命令:nginx -t
如果没问题,就热更新nginx配置,执行命令:nginx -s reload
Nginx代理配置(HTTPS)
此处默认已经申请并有 SSL证书。SSL证书需要区分两种情况:
若是给浏览器访问,则需要专门的CA机构颁发的证书。若你还没申请SSL证书,则可以参考这篇文章:免费SSL证书申请(华为云)
若是自己自定义的双向认证,则可以自己生成SSL证书。可以参考这篇文章:Nginx HTTPS转发HTTPS 里关于服务器证书的生成的内容(或者参考这篇文章直接开始生成证书:OpenSSL 生成双向认证使用的证书)。
先进入到存放服务器证书和证书链的文件夹,记录一下路径。
然后进入到nginx的配置文件路径:cd /etc/nginx/conf.d/
编辑生成一个新的配置文件:vi xxx.conf
注:配置文件的文件名请自定义。
注:下面配置仅为示例,可以自行补充扩展,以及注意地址、域名要改成正确的。
注:关于 Nginx 更详细的介绍,可以参考文章:Linux nginx的安装与入门
静态文件时配置文件内容如下:
server {
# HTTPS默认访问443端口
listen 443 ssl;
# IPv6地址格式,这里忽略
# listen [::]:443 ssl;
server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址,需要和服务器证书的CN保持匹配
# 允许客户端与服务端的连接保持活跃时长,以减少频繁的SSL握手
keepalive_timeout 75s;
# on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
underscores_in_headers on;
# 服务端证书配置
ssl_certificate /path/ssl/5678.crt; # 证明自身的服务器证书
ssl_certificate_key /path/ssl/5678.key; # 证明自身的私钥
# ssl协议
ssl_protocols TLSv1.2 TLSv1.3;
# ssl cipher套接字
ssl_ciphers HIGH:!aNULL:!MD5;
charset utf-8;
# 设置客户端请求body的最大允许大小,默认1m
client_max_body_size 100m;
location / {
root /path/dist; # 请求的根路径,即虽然可能请求时只输入了 IP:Port/ , 但是最终Nginx处理时会变成 IP:Port/path/dist/
index index.html index.htm; # 定义索引文件,即如果路径只输入到/,则内部会重定向加载index匹配到的文件
}
# 定义发生特定错误时给访问者展示的页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
代理服务时配置文件内容如下:
server {
# HTTPS默认访问443端口
listen 443 ssl;
# IPv6地址格式,这里忽略
# listen [::]:443 ssl;
server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址,需要和服务器证书的CN保持匹配
# 允许客户端与服务端的连接保持活跃时长,以减少频繁的SSL握手
keepalive_timeout 75s;
# on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
underscores_in_headers on;
# 服务端证书配置
ssl_certificate /path/ssl/5678.crt; # 证明自身的服务器证书
ssl_certificate_key /path/ssl/5678.key; # 证明自身的私钥
# 验证客户端的CA链(如果是客户端单向验证服务端,则这里不需要配置)
ssl_client_certificate /path/ssl/1234CaChain.pem;
# 开启校验客户端(如果是客户端单向验证服务端,则这里为off)
ssl_verify_client on;
# ssl协议
ssl_protocols TLSv1.2 TLSv1.3;
# ssl cipher套接字
ssl_ciphers HIGH:!aNULL:!MD5;
# 设置验证客户端证书链的深度,默认是1(如果是客户端单向验证服务端,则这里不需要配置)
ssl_verify_depth 10;
charset utf-8;
# 设置客户端请求body的最大允许大小,默认1m
client_max_body_size 100m;
# 内部进行转发
location / {
proxy_pass http://127.0.0.1:8080; # 服务器内部真正处理业务的服务监听的端口
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;
}
}
执行nginx校验配置文件命令:nginx -t
如果没问题,就热更新nginx配置,执行命令:nginx -s reload
实际测试
用Nginx监听的端口,如前文中配置的 80端口(HTTP)、443端口(HTTPS)访问资源,如果访问正常,就说明配置正确。
如果是80端口,则可以像这样访问:http://5.6.7.8
如果是443端口,则可以像这样访问:https://5.6.7.8
如果是其他端口(如1234端口),则可以像这样访问:http://5.6.7.8:1234
可以看出,如果是协议默认端口,则访问时不需要附带端口号,如果不是协议默认端口,访问时就需要附带端口号。