使用nginx配合网页反代及内网穿透快速构建web内容
在构建和部署 Web 服务时,Nginx 作为轻量、高性能的 HTTP 服务器和反向代理工具,几乎是所有运维的必备利器。而对于云服务器资源有限的情况,还可以通过 frp 结合 Nginx 实现内网穿透,让你在本地跑服务、远程部署,灵活又高效
这篇文章将带你从 Nginx 的原理入手,逐步实践从部署 Nginx 到结合反代和 frp 打通内外网络,构建完整 Web 服务,并自动签发 HTTPS 证书
Nginx原理
Nginx 全称 Engine X,是一款高性能、事件驱动的 Web 服务器与反向代理服务器。它最擅长处理静态内容与高并发连接,工作机制如下:
- 事件驱动:采用 epoll/kqueue 实现高效异步 I/O
- 模块化架构:支持通过模块扩展功能,如限速、防火墙、反代、缓存等
- 反向代理:客户端请求并不直接访问目标服务,而是先到 Nginx,由它将请求“反向”转发到实际服务(如 Node.js、Python、PHP 等)上
Nginx的安装与使用(以Debian为例)
安装Nginx
sudo apt-get update
sudo apt-get install nginx -y
启动与状态检查
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
访问服务器公网 IP,若出现 Welcome to nginx
,说明部署成功
构建反代+静态网站配置示例
由于目前大多数网页服务都跑的是后端服务(即Node.js、Python、PHP),所以只介绍反向代理的配置方法
假设我们有一个域名jerry.crystelf.top
我们可以通过以下步骤使Nginx将访问本域名的流量转发到内网的目标端口上,这里假设我们的服务跑在127.0.0.1:3000
上
配置Nginx文件
sudo nano /etc/nginx/sites-available/jerry.crystelf.top.conf # 编辑配置文件,可以直接粘贴到文本编辑器
以下为jerry.crystelf.top
的完整Server
块配置:
server {
listen 80;
server_name jerry.crystelf.top; # 自行修改域名
root /var/www/jerry.crystelf.top; # 自行修改域名
index index.php index.html index.htm default.php default.html default.htm;
# 防止访问敏感文件
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env) {
return 404;
}
# Let's Encrypt 验证目录
location /.well-known/ {
allow all;
}
# 禁止验证目录运行脚本
if ($uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$") {
return 403;
}
# 缓存图片/多媒体
location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
access_log off;
error_log off;
}
# 缓存 CSS 和 JS
location ~* \.(js|css)?$ {
expires 12h;
access_log off;
error_log off;
}
# 反向代理 Web 服务
location ^~ / {
proxy_pass http://127.0.0.1:3000; # 自行修改端口
proxy_set_header Host 127.0.0.1;
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;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header REMOTE-PORT $remote_port;
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
add_header X-Cache $upstream_cache_status;
# 判断静态资源缓存
set $static_filejy2IN4nl 0;
if ($uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$") {
set $static_filejy2IN4nl 1;
expires 1m;
}
if ($static_filejy2IN4nl = 0) {
add_header Cache-Control no-cache;
}
}
access_log /var/log/nginx/jerry.crystelf.top.access.log; #根据需要修改
error_log /var/log/nginx/jerry.crystelf.top.error.log; #根据需要修改
}
创建软链接启用站点
sudo ln -s /etc/nginx/sites-available/jerry.crystelf.top.conf /etc/nginx/sites-enabled/jerry.crystelf.top.conf
创建网站目录
sudo mkdir -p /var/www/jerry.crystelf.top
sudo chown -R www-data:www-data /var/www/jerry.crystelf.top
测试并重载
sudo nginx -t && sudo systemctl reload nginx
当云服务器资源不足:使用 FRP 本地运行服务 + 内网穿透
为什么用 FRP?
有时候,云服务器性能不足、不便部署繁重服务,可以在本地机器运行 Web 服务,然后通过FRP穿透本地内网,将服务暴露到公网服务器上
frp工作原理
- frpc 运行在内网客户端,连接公网服务器的 frps
- 公网服务器监听某个端口(如 7000),将访问转发回本地服务
- 与 Nginx 配合,即可使用域名访问内网服务
FRP 配置示例
公网服务器(frps.ini)
[common]
bind_port = 7000
token = password
其中token为验证密钥,自行修改
本地机器(frpc.ini):
[common]
server_addr = your.server.ip
server_port = 7000
token = password
[web]
type = tcp
local_port = 3000
remote_port = 2000
其中
[web]
为你给这个隧道起的名字type
为连接类型,一般使用tcp
进行连接local_port
为本地运行服务的端口remote_port
为你想要映射到公网服务器的什么端口
frp启动命令:
# 启动 frps
./frps -c ./frps.ini
# 启动 frpc
./frpc -c ./frpc.ini
使用 Certbot 自动申请 HTTPS 证书
为了让网站支持 HTTPS,我们可以使用 Let's Encrypt
提供的免费证书,搭配 certbot
工具一键申请并自动续期
# 安装 certbot
sudo apt-get install certbot python3-certbot-nginx -y
# 自动配置并签发证书
sudo certbot --nginx
# 测试自动续期
sudo certbot renew --dry-run
总结
本文介绍了使用 Nginx 部署网站和反代服务的方法,并结合 frp 实现了内网穿透的场景,最后引入 Certbot 实现 HTTPS 支持
无论你是在云服务器上部署静态网站,还是通过本地运行配合反代,Nginx + FRP 是一套高效灵活的 Web 架构方案