在服务器上部署了自己的项目,用域名解析公网IP后,发现还需要在域名后输入端口号才能打开项目。为了不暴露端口号,我学习并采用了Nginx反向代理技术。
Nginx重定向
在Ubuntu上安装Nginx并将 /blog 路径解析到 指定 端口(4000),可以按照以下步骤进行:
步骤 1: 安装 Nginx
首先,确保您的系统是最新的,然后安装 Nginx:
1 | sudo apt update |
步骤 2: 配置 Nginx
在 Nginx 中创建一个新的配置文件,或者修改现有的配置文件。假设您想添加新的配置文件,可以在 /etc/nginx/sites-available/ 目录下创建一个文件,例如 myConfig:
1 | sudo nano /etc/nginx/sites-available/myConfig |
在文件中添加以下配置(以本网站lonelymeko.top为例):
1 | # --- HTTP (端口 80) 自动重定向到 HTTPS --- |
在 Vue 3 应用中使用 History 路由模式时,需要在 Nginx 中配置 try_files $uri $uri/ /index.html; 的原因与前端路由的工作原理有关。以下是详细解释:
1. History 路由模式 vs Hash 模式
- Hash 模式:URL 形如
http://example.com/#/path,#后的变化不会触发页面刷新,服务器始终收到/#/path前的部分(如/),因此无需特殊配置。 - History 模式:URL 形如
http://example.com/path,更简洁。但用户直接访问或刷新时,浏览器会向服务器请求/path,如果服务器未配置处理逻辑,会返回 404(因为/path不是真实存在的文件或目录)。
2. 为什么需要 try_files?
- 核心问题:Vue 应用是单页应用 (SPA),所有路由均由前端 JavaScript 处理。服务器需要确保无论请求哪个路径(如
/path,/about),都返回index.html,然后由前端路由接管。 try_files的作用:- 先尝试查找
$uri(如请求/js/app.js,则返回真实的 JS 文件)。 - 若找不到,尝试查找
$uri/(目录)。 - 若仍找不到,则回退到
/index.html,交给前端路由处理。
- 先尝试查找
3. Nginx 配置详解
1 | location / { |
root:指定 Vue 打包后的静态文件目录(如dist)。try_files:$uri:尝试直接匹配请求的文件(如 CSS、JS 等静态资源)。$uri/:尝试匹配目录(较少用到,但保留以兼容某些情况)。/index.html:最终回退选项,确保所有路由返回入口文件。
4. 不配置的后果
- 用户直接访问
/about或刷新页面时,Nginx 找不到对应的文件或目录,返回 404。 - 只有从首页(
/)导航时,前端路由才能正常工作(因为此时已加载index.html和 JS)。
5. 其他注意事项
后端协作:如果应用有独立的后端 API,需确保 Nginx 不会将 API 路径(如
/api/xxx)也指向index.html。可以通过额外的location块排除:1
2
3location /api {
proxy_pass http://backend; # 转发到后端
}Base URL:若应用部署在子路径(如
/app/),需同步配置 Vue Router 的base选项和 Nginx 的root。
Nginx 的 try_files $uri $uri/ /index.html; 是 History 模式的必要配置,它确保了服务器在找不到真实文件时,能正确回退到前端路由的入口文件(index.html),从而避免 404 错误。这是 SPA 部署的常见实践,适用于 Vue、React 等现代前端框架。
步骤 3: 启用配置
将您刚创建的配置文件链接到 sites-enabled 目录:
1 | sudo ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled/ |
步骤 4: 测试 Nginx 配置
在重新加载 Nginx 之前,检查配置是否正确:
1 | sudo nginx -t |
如果没有错误,你会看到一个提示说配置成功。
步骤 5: 重新加载 Nginx
重新加载 Nginx 以应用更改:
1 | sudo systemctl reload nginx |
步骤 6: 确保服务在4000端口上运行
确保你的应用程序(例如一个 Node.js 或其他服务)正在监听 4000 端口。你可以使用以下命令检查:
1 | sudo lsof -i :4000 |
如果服务没有运行,请启动它,确保它可以接收来自 Nginx 的请求。
其他注意事项
- 如果您的服务器使用防火墙,确保打开80端口(HTTP)和4000端口。
- 如果您使用的是HTTPS,记得设置适当的SSL配置。
完成这些步骤后,访问 http://your_domain_or_IP/blog 应该会成功将请求代理到4000端口的应用程序。如果还有其他问题或需要进一步的帮助,欢迎随时询问!
查看 Nginx 访问和错误日志
查看 Nginx 的访问日志和错误日志,以获取关于请求失败的更多信息:
1 | bash# 查看访问日志 |
暂停 Nginx 服务:
运行以下命令来停止 Nginx 服务:
1 | sudo systemctl stop nginx |
这会将 Nginx 完全停止,不再处理任何请求。
补充.Nginx 定义、背景
代理服务器 接受用户请求 代理到其他服务器 三大特点:反向代理 负载均衡 动静分离 Nginx (是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAPPOP3SMTP服务。
Nginx是由伊戈尔:赛索耶夫为俄罗斯访河量第二的Rambler.u站点(俄文:PaM6nep)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝
等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站:
Nginx是一个安装非常的简单、配置文件非常简洁(还能够支持per语法)、Bug非常少的服务。Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级,
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。