搭建基于 Nginx 反向代理与 Let’s Encrypt 自动续期的前端服务

微信扫一扫,分享到朋友圈

搭建基于 Nginx 反向代理与 Let’s Encrypt 自动续期的前端服务

作者:wiLdGoose
发布时间:2018 年 9 月 30 日
分类:技术 Technology

好久不在贵行混,殊不知原先那套 LAMP 或 LNMP 的架构早已奥特且随着岁月流逝慢慢发生了升级与变迁。

这次要玩的是一套提供前端服务的架构。大致交代一下故事背景:

1、负载机绑定了 1 个公网 IP 与 1 个私网 IP(VIP地址、私网 IP 漂移、HAProxy 高可用啥的需要运营商配合,正在准备,以后玩过了再写),部署 Nginx 用于反向代理;

2、前端服务所在主机与负载机在同一私网网段内。

好了,故事开始。

首先部署完负载机的 Nginx 服务,用于监听负载机的 TCP 80 及 443 端口。值得注意的是若使用源码编译方式安装 Nginx,记得添加:


--with-http_ssl_module --with-http_realip_module

其实直接 yum 也阔以。安装后对配置文件 nginx.conf 进行调整:


user www www;

worker_processes auto;

error_log /path/to/logs/error.log;

pid /path/to/logs/nginx.pid;

worker_rlimit_nofile 65535;

events {

use epoll;

worker_connections 65535;

}

http {

include mime.types;

default_type application/octet-stream;

include /usr/local/nginx/conf/reverse-proxy.conf;

sendfile on;

keepalive_timeout 65;

gzip on;

client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户

client_body_buffer_size 256k;

client_header_timeout 3m;

client_body_timeout 3m;

send_timeout 3m;

proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)

proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)

proxy_send_timeout 300s;

proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘

proxy_ignore_client_abort on; #不允许代理端主动关闭连接

server {

listen 80;

server_name _;

location / {

root html;

index index.html index.htm;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

记得打开防火墙端口,若还有上级网络安全策略等,更新配置。

前端机 Web 服务因人而异了,这里假定还是由 Nginx 提供前端服务,部署过程略,监听前端机的 TCP 80 端口。值得注意的是需要在 Nginx 配置文件中定义日志格式:


log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $HTTP_X_Forwarded_For';

access_log /path/to/logs/access.log access;

在负载机上编辑反向代理的配置文件:


vim /usr/local/nginx/conf/reverse-proxy.conf

若有多个 server 可再行扩展:


server

{

listen 80;

server_name sub.domain.com;

location / {

proxy_redirect off;

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_pass http://192.168.x.x;

}

access_log /path/to/logs/sub.domain.com_access.log;

}

截至目前,http 协议的转发已经完成。域名解析完成且生效后,访问应该会从负载机走私网定向到前端机。看了一圈日志没问题后,继续折腾 https。

SSL 证书提供商毫无疑问是 Let’s Encrypt。据我所知有 certbot-auto 与 acme.sh 两种方式来实现证书自动申请与续展,前者貌似只能支持单个域名,而后者目前已支持泛域名证书。因此我选择后者。

配置过程就不展开了,中文版引导在 这里
。值得注意的是,若使用 certbot-auto,则需要修改负载机 Nginx 的反向代理配置文件,将 .well-known 目录指向本地:


server {

listen 80;

server_name sub.domain.com;

[…]

location /.well-known {

alias /path/to/sub.domain.com/.well-known;

}

location / {

# proxy commands go here

[…]

}

}

若使用 acme.sh,则既可通过 .well-known 目录来验证,也可通过 DNS 解析来验证(需提前向域名注册商申请 API)。可参考 这里

好了,到这里,证书更新的事儿也是自动的。

去喝杯咖啡吧~

Update:

已实现客户端到负载机的访问是公网 https,负载机转发到前端机走私网 http。已遇到一个问题,最新版的 phpMyAdmin 会提示:


服务器和客户端上指示的 HTTPS 之间不匹配。这可能导致 phpMyAdmin 无法正常工作或存在安全风险。请修复您的服务器配置以正确指示 HTTPS。

嗯~有待进一步解决。

手把手教你实现RecyclerView的下拉刷新和上拉加载更多

上一篇

Samsung has New Plans Regarding its Anniversary Phone

下一篇

你也可能喜欢

搭建基于 Nginx 反向代理与 Let’s Encrypt 自动续期的前端服务

长按储存图像,分享给朋友