使用Nginx做反向代理
文章目录
- 使用Nginx做反向代理
- 代理HTTP请求
- 代理HTTPS请求
- 举个大栗子
代理HTTP请求
按照以下步骤使用Nginx做反向代理:
-
编辑 Nginx 的配置文件。默认情况下,Nginx 的配置文件位于
/etc/nginx/nginx.conf
。sudo nano /etc/nginx/nginx.conf
-
在配置文件中的
http
段中添加以下内容:server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:8102; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
请将
yourdomain.com
替换为你的域名或服务器 IP。以上配置会将来自端口为 80 的请求转发到本地的端口为 8102 的服务上。
如果没有域名的话,可以直接将配置文件内容改为下面的
server { listen 80; location / { proxy_pass http://localhost:8102; } }
这里的 proxy_pass 用来设置要代理的应用程序的地址,这里设置为本地的 http://localhost:8102,也可以设置为其他 IP 地址和端口。这样就可以将流量转发到要代理的应用程序上了。
-
检查 Nginx 配置文件语法是否正确。
sudo nginx -t
-
如果语法正确,则重新加载 Nginx 配置文件。
sudo systemctl reload nginx
-
现在,你可以通过访问你的域名
http://yourdomain.com
或者你主机的IP地址http://xxx.xxx.xxx.xxx
来访问你的服务了。
代理HTTPS请求
如果是代理HTTPS 请求的话上面的步骤可以忽略了,按照以下方式进行配置HTTPS的反向代理:
- 首先,确保你的服务器上已经安装了 SSL 证书,并已经配置了 HTTPS 监听器。这里不再赘述。
注意 :开启https请求是需要域名的;在没有域名的情况下开启 HTTPS 请求是有一定难度的,因为 HTTPS 协议中需要使用到 SSL/TLS 证书,证书需要绑定到域名上,这样才能保证通信过程的安全性。如果没有域名,你可以尝试使用自签名证书,但是这种证书在浏览器中会被标记为不安全,而且使用自签名证书也无法避免中间人攻击的风险。因此,建议在使用 HTTPS 请求之前先获得一个域名,然后使用该域名来申请 SSL/TLS 证书。如果需要申请免费的SSL证书,请看这篇文章 :为域名申请免费的SSL证书,实现启用HTTPS加密
-
编辑 Nginx 配置文件
/etc/nginx/sites-available/default
:
在修改配置文件前先备份一下配置文件,防止修改错误后无法恢复:cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
然后在命令行中输入vim /etc/nginx/sites-available/default
,进入vim编辑器编辑下面的内容server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/ssl/cert.pem; ssl_certificate_key /path/to/ssl/key.pem; location / { proxy_pass http://127.0.0.1:8102; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_buffering off; } }
这是一个 Nginx 配置文件的示例,用于将 HTTP 和 HTTPS 请求转发到本地的 8102 端口上。
第一个 server 块监听 80 端口,如果请求的是 example.com
,则返回一个 301 重定向到 HTTPS 协议。$server_name
变量表示 server_name
指令设置的主机名,$request_uri
变量表示请求的 URI。
第二个 server 块监听 443 端口,使用 SSL 协议进行加密通信。ssl_certificate 和 ssl_certificate_key 指令分别指定 SSL 证书和私钥的路径,用于对客户端和服务器之间的通信进行加密。
location 块定义了一个请求的 URI 到本地服务的映射关系。proxy_pass 指令将请求转发到 127.0.0.1:8102,即本地的 8102 端口上。proxy_set_header 指令设置了一些 HTTP 头信息,例如 Host 头和 X-Real-IP 头,用于将请求头信息传递给后端的服务。proxy_redirect、proxy_buffering 指令分别用于关闭重定向和缓存。
-
检查 Nginx 配置文件语法是否正确。
sudo nginx -t
-
如果没有错误,重启 Nginx 服务:在命令行中输入
sudo systemctl restart nginx
这个配置将会将 HTTPS 请求通过 Nginx 反向代理到本地的 http://127.0.0.1:8102
端口,同时将请求头中的 Host
、X-Real-IP
和 X-Forwarded-For
值设置为当前请求的值。proxy_redirect off
表示禁用 Nginx 默认的代理重定向行为,proxy_buffering off
表示关闭 Nginx 对响应内容的缓冲。
举个大栗子
比如我的域名为:data.zenytech.xyz, 将使用Nginx实现代理https的请求
-
先备份一份配置文件, 防止出错
root@myserver:~# cd /etc/nginx/sites-available/ root@myserver:/etc/nginx/sites-available# ls default root@myserver:/etc/nginx/sites-available# cp default default.bak root@myserver:/etc/nginx/sites-available# ls default default.bak root@myserver:/etc/nginx/sites-available# vim default
-
default文件修改如下:
server { listen 80; server_name data.zenytech.xyz; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name data.zenytech.xyz; location / { proxy_pass http://127.0.0.1:8102; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_buffering off; } ssl_certificate /etc/letsencrypt/live/data.zenytech.xyz/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/data.zenytech.xyz/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = data.zenytech.xyz) { return 301 https://$host$request_uri; } # managed by Certbot listen 80 ; listen [::]:80 ; server_name data.zenytech.xyz; return 404; # managed by Certbot }
当用户请求data.zenytech.xyz
时,第一个server block会将请求重定向到https。第二个server block监听443端口,配置SSL证书,同时将请求代理到本地的8102端口。第三个server block是由Certbot管理的,用于重定向所有HTTP请求到HTTPS。因此,这个配置允许用户通过data.zenytech.xyz
访问我的服务,并使用SSL保护其安全性。
- 最后重启一下Nginx的服务即可。