使用nginx配合网页反代及内网穿透快速构建web内容

26 天前
/ ,
20
1

使用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 等)上
Excalidraw Loading...

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 配合,即可使用域名访问内网服务
Excalidraw Loading...
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 架构方案

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...