起因

我在使用dockers 来搭建一个网站时遇到了一个问题,因为我在80端口已经被nginx服务listen,浏览器默认的端口又是80,这样我想在浏览器访问网站时就要加上端口号,这可太不优雅了,我一开始的设想是,更改容器端口映射。但是这样我之后要使用80就又要去重新配置一遍。于是我想到了用nginx的反向代理来优雅的访问,下面是我配置时遇到的一些问题和想法,做一些记录

什么是反向代理

代理这个词我知道,正向代理我也知道,但是反向代理是什么鬼?正向代理是对客户端(client)来进行代理,那么反向代理就是相对于服务端(server)来说,反向代理就是正向代理的相反,我这样理解没错吧。

举几个例子,我们在访问国外网站,睁眼看世界时,想要绕开防火墙就会使用VPN技术,里面就有一种技术叫流量代理,这是代理服务器就会作为客户端,代理我们去访问这些网站,然后把拿到的数据返回给我们,这就是一个正向代理,还有我们去使用的Fidder也使用了代理的技术,Fidder使用代理技术,将服务器反送给客户端的数据拦截,可以理解成Fidder伪装成了客户端从而获取信息,这样就可以对信息做篡改,再返回给真实的客户端。

反向代理就是把服务端的数据做代理,比如我们去访问一个网站时,就拿我最喜欢刷的抖音来说,抖音背后的服务器肯定是成千上万台的,但是对外暴露的域名只有一个,我只能通过这一个域名来访问,当我像抖音发送请求时,会向这个代理服务器发送请求,代理服务器会向真实的服务器发送请求,这样就可以隐藏真实的服务器IP和端口信息了,这里代理的是服务端,这个过程对于客户端是完全透明的。

使用Nginx进行反向代理并配置SSL证书

Nginx安装配置

可以使用 -V 来查看Nginx配置文件的存放路径以及版本和编译参数等信息

# 适用 vim 编辑 halo.conf
vim /etc/nginx/conf.d/halo.conf
upstream halo {
  server 127.0.0.1:8090;
}

# 配置一个服务器块
server {
  # 配置服务器监听端口 80 和 443 (SSL)
  listen 80;
  listen 443 ssl;

  # 配置服务器名称(域名)
  server_name example.com;

  # 配置 SSL 证书和密钥的路径
  ssl_certificate /path/to/your/cert/example.com.pem;
  ssl_certificate_key /path/to/your/cert/cert.key;

  # 设置客户端上传文件的最大大小为 1024MB
  client_max_body_size 1024m;

  # 配置请求的处理位置
  location / {
    # 将所有请求代理到上游服务器组 halo
    proxy_pass http://halo;

    # 配置代理头信息
    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;
  }
}
  • listen 80;listen 443 ssl;:配置服务器监听 HTTP 端口 80 和 HTTPS 端口 443

  • server_name example.com;:配置服务器名称为 example.com

  • ssl_certificatessl_certificate_key:配置 SSL 证书和密钥的路径。

  • client_max_body_size 1024m;:设置客户端上传文件的最大大小为 1024MB

  • location /:配置请求的处理位置:

    • proxy_pass http://halo;:将所有请求代理到上游服务器组 halo

    • proxy_set_header:配置代理头信息,包含主机、协议、客户端 IP 和转发的 IP 地址等信息。

可以使用 -t 检查配置文件是否正确,也可用来定位配置文件的位置,检查无误后

# 重载 Nginx 配置
sudo nginx -s reload

这样就完成了这个网站的,反向代理和SLL证书的配置。

一个懒人