侧边栏壁纸
博主头像
Zeeland

The mixture of software dev+Iot+ml+anything

  • 累计撰写 60 篇文章
  • 累计创建 45 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

nginx配置反向代理教程

Zeeland
2022-11-17 / 2 评论 / 5 点赞 / 368 阅读 / 2,352 字

Introduction

之前跑项目的时候用过反向代理的功能,看了一下反向代理的功能,但是并没有很深刻的了解,今天在用docker + nginx搭建博客的时候才对这个问题有更加深刻的理解。

什么是正向代理?

正向代理提供了一个代理服务器,代替客户端去对应服务器获取信息,如VPN代理,为什么挂上学校的VPN就能访问知网?因为学校的服务器可以合法访问知网的数据库,你通过挂上学校的VPN,学校帮你去获取数据; 还有一个典型的用途是为防火墙内的局域网客户端提供访问服务器的途径,此外,正向代理还可以使用缓冲特性减少网络利用率。

什么是反向代理?

反向代理则是客户端向服务端发送请求的时候,代理服务器先接受客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上返回的信息返回给客户端,nginx就是一个常见的例子,如果你的项目在www.project.cn:8888 ,通过nginx设置反向代理,你只需要访问www.project.cn 就可以获得8888端口的数据,简单来说,就是一个重定向的功能。

Halo就是这样,本来项目可以通过www.域名:8090 端口直接访问,通过nginx反向代理之后,通过www.域名 就可以访问了,更加方便。

如何给nginx设置反向代理?

如果你想要在访问www.blog.xxx.cn 的时候自动跳转到你的博客,而不是使用xxx.cn:8090 才能访问你的博客,那么你需要给8090端口设置反向代理,将xxx.cn:8090 的内容映射到www.blog.xxx.cn 。如果你对 Nginx 不熟悉,我们推荐使用 OneinStack 来管理 Nginx。

通过 OneinStack 安装 Nginx

进入 OneinStack 官网,仅选择 安装 Nginx,其他的都可以取消选择。

最后点击 复制安装命令 到服务器执行即可。如果你仅安装 Nginx,你的链接应该是这样:

wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1

这一步会经过编译安装,可能会导致安装时间很漫长,这主要取决于你服务器的性能。

出现下面的信息即代表安装成功:

Nginx installed successfully!
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
Redirecting to /bin/systemctl start nginx.service
####################Congratulations########################
Total OneinStack Install Time: 5 minutes

Nginx install dir:              /usr/local/nginx

创建 vhost

即创建一个站点,你可以通过这样的方式在你的服务器创建无限个站点,也就是说,你可以通过这种方式创建无限个反向代理,让www.blog.xxx.cnwww.xxx.cn 都可以映射你的www.xxx.cn:8090 的项目。

接下来的目的就是创建一个站点,并反向代理到 Halo。这一步在此教程使用 demo.halo.run 这个域名做演示,实际情况请修改此域名。

  1. 进入到 oneinstack 目录,执行 vhost 创建命令
cd oneinstack
sh vhost.sh
  1. 按照提示选择或输入相关信息
What Are You Doing?
    1. Use HTTP Only
    2. Use your own SSL Certificate and Key
    3. Use Let's Encrypt to Create SSL Certificate and Key
    q. Exit
Please input the correct option:

这一步是选择证书配置方式,如果你有自己的证书,输入 2 即可。如果需要使用 Let’s Encrypt 申请证书,选择 3 即可,下面回车.

Please input domain(example: www.example.com):

输入自己的域名即可,前提是已经提前解析好了域名。

Please input the directory for the domain:demo.halo.run :
(Default directory: /data/wwwroot/demo.halo.run):

提示输入站点根目录,因为我们是使用 Nginx 的反向代理,所以这个目录是没有必要配置的,我们直接使用默认的即可(直接回车)。

Do you want to add more domain name? [y/n]:

是否需要添加其他域名,按照需要选择即可,如果不需要,输入 n 并回车确认。

Do you want to add hotlink protection? [y/n]:

是否需要做防盗链处理,按照需要选择即可。

Allow Rewrite rule? [y/n]:

路径重写配置,我们不需要,选择 n 回车确定即可。

Allow Nginx/Tengine/OpenResty access_log? [y/n]:

Nginx 的请求日志,建议选择 y

这样就完成了 vhost 站点的创建,最终会输出站点的相关信息:

Your domain:                  demo.halo.run
Virtualhost conf:             /usr/local/nginx/conf/vhost/demo.halo.run.conf
Directory of:                 /data/wwwroot/demo.halo.run

Nginx 的配置文件即 /usr/local/nginx/conf/vhost/demo.halo.run.conf

修改 Nginx 配置文件

上方创建 vhost 的过程并没有创建反向代理的配置,所以需要我们自己修改一下配置文件。

  1. 使用你熟悉的工具打开配置文件,此教程使用 vim。
vim /usr/local/nginx/conf/vhost/demo.halo.run.conf
  1. 删除一些不必要的配置
location ~ [^/]\.php(/|$) {
  #fastcgi_pass remote_php_ip:9000;
  fastcgi_pass unix:/dev/shm/php-cgi.sock;
  fastcgi_index index.php;
  include fastcgi.conf;
}

此段配置是针对 php 应用的,所以可以删掉。

  1. 添加 upstream 配置
    在 server 的同级节点添加如下配置:
upstream halo {
  server 127.0.0.1:8090;
}
  1. server 节点添加如下配置
location / {
  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;
  # 这里的halo是upstream的名字,也可以直接用http://127.0.0.1:8090代替
  proxy_pass http://halo; 
}
  1. 修改 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ 节点
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
# 这里的halo是upstream的名字,也可以直接用http://127.0.0.1:8090代替
  proxy_pass http://halo;
  expires 30d;
  access_log off;
}
  1. 修改 location ~ .*\.(js|css)?$ 节点
location ~ .*\.(js|css)?$ {
  # 这里的halo是upstream的名字,也可以直接用http://127.0.0.1:8090代替
  proxy_pass http://halo;
  expires 7d;
  access_log off;
}

如果不按照第 5,6 步操作,请求一些图片或者样式文件不会经过 Halo,所以请不要忽略此配置。

  1. 添加 acme.sh 续签验证路由

如果你使用的是自己的SSL证书,则这一步无需理会。

OneinStack 使用的 acme.sh 管理证书,如果你在创建 vhost 的时候选择了使用 Let’s Encrypt 申请证书,那么 OneinStack 会在系统内添加一个定时任务去自动续签证书acme.sh 默认验证站点所有权的方式为在站点根目录生成一个文件(.well-known)来做验证,由于配置了反向代理,所以在验证的时候是无法直接访问到站点目录下的 .well-known 文件夹下的验证文件的。需要添加如下配置:

location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  allow all;
  root /data/wwwroot/demo.halo.run/;
}
  1. 将自己的SSL证书传入 /usr/local/nginx/conf/ssl中替代原有的证书

如果你从云服务厂商(如阿里云)那里申请了证书,可以将证书的具体信息下载下来。

至此,配置修改完毕,保存即可。最终你的配置文件可能如下面配置一样:

upstream halo {
  server 127.0.0.1:8090;
}
server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/demo.halo.run.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/demo.halo.run.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name demo.halo.run;
  access_log /data/wwwlogs/demo.halo.run_nginx.log combined;
  index index.html index.htm index.php;
  root /data/wwwroot/demo.halo.run;
  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
  include /usr/local/nginx/conf/rewrite/none.conf;
  #error_page 404 /404.html;
  #error_page 502 /502.html;
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    proxy_pass http://halo;
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    proxy_pass http://halo;
    expires 7d;
    access_log off;
  }
  location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
    deny all;
  }
  location / {
    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;
    proxy_pass http://halo;
  }
  location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    allow all;
    root /data/wwwroot/demo.halo.run/;
  }
}

重载 Nginx 使配置生效

验证 nginx 配置

nginx -t

如果输出如下提示则代表配置有效:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

重载 Nginx 配置:

nginx -s reload

如果遇到nginx: [error] invalid PID number “” in "/var/run/nginx/nginx.pid"的问题,可以参考https://www.cnblogs.com/S–S/p/8399984.html

References

5

评论区