使用Nginx做反向代理


文章目录

  • 使用Nginx做反向代理
  • 代理HTTP请求
  • 代理HTTPS请求
  • 举个大栗子


代理HTTP请求

按照以下步骤使用Nginx做反向代理:

  1. 编辑 Nginx 的配置文件。默认情况下,Nginx 的配置文件位于 /etc/nginx/nginx.conf
sudo nano /etc/nginx/nginx.conf
  1. 在配置文件中的 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 地址和端口。这样就可以将流量转发到要代理的应用程序上了。

  1. 检查 Nginx 配置文件语法是否正确。
sudo nginx -t
  1. 如果语法正确,则重新加载 Nginx 配置文件。
sudo systemctl reload nginx
  1. 现在,你可以通过访问你的域名 http://yourdomain.com或者你主机的IP地址http://xxx.xxx.xxx.xxx 来访问你的服务了。

代理HTTPS请求

如果是代理HTTPS 请求的话上面的步骤可以忽略了,按照以下方式进行配置HTTPS的反向代理:

  1. 首先,确保你的服务器上已经安装了 SSL 证书,并已经配置了 HTTPS 监听器。这里不再赘述。

注意 :开启https请求是需要域名的;在没有域名的情况下开启 HTTPS 请求是有一定难度的,因为 HTTPS 协议中需要使用到 SSL/TLS 证书,证书需要绑定到域名上,这样才能保证通信过程的安全性。如果没有域名,你可以尝试使用自签名证书,但是这种证书在浏览器中会被标记为不安全,而且使用自签名证书也无法避免中间人攻击的风险。因此,建议在使用 HTTPS 请求之前先获得一个域名,然后使用该域名来申请 SSL/TLS 证书。

  1. 编辑 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 指令分别用于关闭重定向和缓存。

  1. 检查 Nginx 配置文件语法是否正确。
sudo nginx -t
  1. 如果没有错误,重启 Nginx 服务:在命令行中输入
sudo systemctl restart nginx

这个配置将会将 HTTPS 请求通过 Nginx 反向代理到本地的 http://127.0.0.1:8102 端口,同时将请求头中的 HostX-Real-IPX-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的服务即可。