前端教程(nginx 快速入门教程 - 写给前端的你)

前端教程(nginx 快速入门教程 - 写给前端的你)
nginx 快速入门教程 - 写给前端的你

经常做 To G 项目的朋友都知道,项目通常是在内网环境进行开发和调试。甚至会通过好几层跳板机进行访问,所以就无法进行 CI/CD 自动化部署。莫得办法,只能手动打包复制文件进行部署。自然而然就得学点 nginx 技能傍身

就算你公司有专业运维,有自动化部署,哪怕都没有,那也有后端,你问我你作为一个前端学 nginx 干啥?

不为啥,不蒸馒头争口气,吃技术这碗饭,有些东西你可以不用,但不能不会,给我学,卷起来!

接下来就教大家如何通过 nginx 部署项目,以及一些 nginx 常用配置的修改

1. nginx 下载

nginx 官网下载链接: nginx.org/en/download…

选择一个稳定版本(Stable version)和对应的系统 #Nginx #前端 #前端工程化 #每日精选文章进行下载

我是 windows 系统,所以选择 nginx/Windows-1.28.2 ,单击即可下载

nginx 是绿色免安装的,下载的内容是一个 zip 压缩包,大小也就 2.61 MB,解压后长这样

把解压后的文件夹移动到自己想要摆放的目录下,我这里放到了电脑 D 盘

前端教程(nginx 快速入门教程 - 写给前端的你)

2. nginx 目录解析

一般只会用到 nginx 下面的 conf 和 html 文件夹

C 2.1 conf 文件夹

conf 文件夹 下的 nginx.conf 是 nginx 的配置文件,我们通过编辑 nginx.conf 文件 修改 nginx 的配置

打开 nginx.conf 文件,里面是默认的配置内容,#号 后面是注释,可删除

由图可见,nginx.conf 配置监听了 80 端口 ,并指向了 html 文件夹,并且 80 端口对应的默认启动页面为 index.html ,打开 80 端口后就会自动运行此 index.html 文件

nginx.conf 层级关系:

`main` (全局设置,影响 nginx 的整体运行(如运行用户、进程数、错误日志))├── `events` (设置网络连接处理参数(如最大并发连接数))└── `http` (处理网页请求的核心模块(缓存、代理、日志等))├── `upstream`(负载均衡组)├── `server`(虚拟主机配置,一台服务器可以运行多个网站,每个网站对应一个 server 块)│ ├── `server_name`(域名)`listen`(监听端口)│ └── `location`(路由匹配,决定请求如何转发(如静态资源、反向代理到后端))│ ├── `root、alias、proxy_pass`等└──`server`(另一个虚拟主机)

HTML 2.2 html 文件夹

html 文件夹 用于存放我们的打包后的需要部署的文件,像前端的 vue 项目,通过 npm run build 打包后得到的 dist 文件夹里的内容直接放到这里即可

nginx 也给我们提供了一个默认 index.html,打开后看到内容是一个欢迎页面

3. 运行 nginx 部署的项目

使用 nginx 部署项目,通常需要做两部分工作:

一是将前端项目进行打包,并放到 html 文件夹下面

二是修改 nginx 配置(端口号和对应文件夹,以及后端接口的代理)

既然 nginx 默认把基础的配置写好了,index.html 文件也给我们准备好了,那我们就来运行 nginx,看看效果

双击 nginx.exe 启动 nginx

点击更多信息 -> 选择仍要运行

点击允许

通过任务管理器搜索 nginx,如果在运行中就代表启动成功

通过 ipconfig 命令查看在局域网上的本地 ip

在浏览器输入自己的 ip + 端口即可访问部署的项目

这里没加端口是因为 80 是 http 协议默认的端口,加不加都是一样的

项目访问地址 = 当前 nginx 所在机器的 ip 地址加上项目所配置的端口号

所以我们的访问地址就是:http://192.168.20.69

成功访问到了欢迎页面 index.html,撒花!

另外值得一提的是,本地 ip = localhost = 127.0.0.1 ,所以这里的

http://192.168.20.69/ 和 http://localhost/ 以及 http://127.0.0.1/ 其实是一个东西

成功访问到同一个服务

4. 查看端口占用情况

列出所有端口的使用情况

netstat -ano

如果端口冲突就需要将端口修改为一个未被占用的值

查看指定端口号是否被占用

netstat -ano|findstr 80

查看指定端口号被什么程序占用

tasklist|findstr 80

5. 修改端口

我把默认的 80 端口改为 8881

编辑 nginx.conf 文件后需要重启 nginx 才能生效

nginx 重启方式:在任务管理器直接关闭,然后重新运行即可。注意进程有两个,应该先关闭下面一个,再关闭上面一个(下面一个是守护进程,如果你先关闭了上面的他自己还会重新打开)

在任务管理器搜索 nginx -> 单击鼠标右键 -> 点击结束任务

我刚才试过了,点击外层的这个进行关闭也是可以的

关闭之后,nginx 服务就无法访问了

双击 nginx.exe 重新启动 nginx

⚠️ 注意!如果 nginx 无法启动,说明 nginx.conf 配置文件有问题,需要查看并修改配置文件

之前的 80 端口无法访问了,而修改后的 8881 端口可以成功访问

6. 新增端口

编辑 nginx.conf 文件,复制粘贴整个 8881 端口对应的 server,删掉注释,新增一个 8882 端口,指向 test 文件夹

这里的文件夹名字是可以随便取的,你也可以不叫 test,叫 xiaokeai 也可以,只要跟 nginx 根目录下新增的文件夹保持名字一致即可

在 html 同级目录下新增 test 文件夹

修改 index.html 文件的内容

关闭 nginx 进程后重启,然后浏览器输入 8882 端口

8881 和 8882 能同时访问,互不影响,配置成功,撒花!

7. 同一端口下运行两个项目

正常情况下,一个端口就是对应的一个项目

可是世事无常,总有一个奇葩需求会让你碰到

在下就曾领教过,甲方要求在同一端口下运行两个项目

如何操作?看我演示!

这一次不需要修改配置文件,直接在 test 目录下新增两个文件夹即可

新增的两个文件夹为 project1 和 project2

两个文件夹内分别新增一个 index.html 文件,内容如下

既然没有修改配置文件,那么就无需重启 nginx,直接在端口后跟上文件名即可

看明白了吗?你项目想取什么名字,就把文件夹的名字改成它就行了

8. nginx 配置后端接口

8.1 HTTP 反向代理

还记得刚入行做前端时,那道经典的面试题吗?如何解决跨域问题?那个背得滚瓜烂熟的答案 - 用 nginx 做反向代理,反向代理就是使用 proxy_pass 来配置

8.1.1 vite.config.ts

这是 vite.config.ts 文件,用于 vue 项目开发时的代理配置

proxy: {    '/api': {        target: 'http://192.168.10.70:9876', // 后端接口        changeOrigin: true,        rewrite: (path) => path.replace(/^\/api/, ''),    },    '/videoURL': {        target: 'http://192.168.10.70:9877', // 视频代理        changeOrigin: true,        rewrite: (path) => path.replace(/^\/videoURL/, ''),    },},

8.1.2 nginx.conf

这是 nginx.conf 文件,用于 nginx 项目部署时的反向代理配置

server {    listen 8881;    server_name localhost;location / { root html; index index.html index.htm; }location /api/ { # 反向代理:将 “api” 开头的请求转发到 “http://192.168.10.160:9876” 后端服务# 注意:末尾加 “/” 代表剥离匹配到的 “/api/”(即请求 /api/user 会变成 http://...:9876/user),不加 “/” 则保留(即请求 /api/user 会变成 http://...:9876/api/user)proxy_pass http://192.168.10.160:9876/; # 传递真实客户端信息:把客户端的真实身份(域名、IP、协议)告诉后端proxy_set_header Host $host; # 传递客户端真实域名proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IPproxy_set_header X-Forwarded-Proto $scheme; # 传递协议(http 或 https)} location /videoURL/ { # 反向代理:将 “videoURL” 开头的请求转发到 “http://192.168.10.160:9877 后端服务# 注意:末尾加 “/” 代表剥离匹配到的 “/videoURL/”(即请求 /videoURL/actionMovie 会变成 http://...:9876/actionMovie),不加 “/” 则保留(即请求 /videoURL/actionMovie 会变成 http://...:9876/videoURL/actionMovie)proxy_pass http://192.168.10.160:9877/; # 传递真实客户端信息:把客户端的真实身份(域名、IP、协议)告诉后端proxy_set_header Host $host; # 传递客户端真实域名proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IPproxy_set_header X-Forwarded-Proto $scheme; # 传递协议(http 或 https)}error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
  • proxy_pass :定义后端服务器的地址,注意区分末尾斜杠的作用
  • proxy_set_header :重新定义或添加发往后端服务器的请求头
  • Host $host :把浏览器访问的真实域名传给后端
  • X-Real-IP :把浏览器访问的真实用户 IP 传给后端,不加的话全部变成 Nginx 的 IP
  • X-Forwarded-For :记录一个完整的 IP 链(用户 IP -> 代理1 -> 代理2)
  • X-Forwarded-Proto :告诉后端原始协议是 http 还是 https,避免在 HTTPS 下生成非安全的 HTTP 链接

注意!一个端口下运行两个项目的话,nginx 配置反向代理,需要在接口前面加上对应的项目名;假如项目名为 project1 和 project2 ,配置示例:

location /project1/api/ {    proxy_pass http://192.168.10.160:9877/;}location /project2/api/ {    proxy_pass http://192.168.10.160:9877/;}

C 8.2 WebSocket 配置

WebSocket 接口配置稍有不同

8.2.1 vite.config.ts

proxy: {    '/ws': {        target: 'ws://192.168.10.70:9878', // WebSocket        changeOrigin: true,        rewrite: (path) => path.replace(/^\/ws/, ''),    },},

8.2.2 nginx.conf

location /alarmWs/ {        proxy_pass http://192.168.10.7:8882/; # 转发到后端# 关键配置:允许协议升级为 WebSocketproxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";# 身份信息透传:把客户端的真实身份(域名、IP、协议)告诉后端proxy_set_header Host $host; # 传递客户端真实域名proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IPproxy_set_header X-Forwarded-Proto $scheme; # 传递客户端真实协议# 超时设置:如果 300 秒(时间根据业务需求调整)内没有数据传输,Nginx 会主动断开连接proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_connect_timeout 10s;}
  • proxy_http_version 1.1
Nginx 默认代理时用的是 HTTP/1.0(老协议)。WebSocket 协议升级(Upgrade)必须基于 HTTP/1.1。这一句代码表示强制把代理请求升级到 1.1。
  • Upgrade $http_upgrade
把客户端发来的 Upgrade: websocket 原样转发给后端。  $http_upgrade 是 Nginx 变量,自动取客户端的 Upgrade 头。
  • Connection "upgrade"
告诉后端:“请把连接从普通 HTTP 升级 成 WebSocket 长连接”。
  • Host $host

把浏览器访问的真实域名传给后端

  • X-Real-IP

把浏览器访问的真实用户 IP 传给后端,不加的话全部变成 Nginx 的 IP

  • X-Forwarded-For

记录一个完整的 IP 链(用户 IP -> 代理1 -> 代理2)

  • X-Forwarded-Proto

告诉后端原始协议是 http 还是 https,避免在 HTTPS 下生成非安全的 HTTP 链接

  • proxy_read_timeout

Nginx 从后端读取响应的最长等待时间(默认 60s)

允许连接长时间保持开启。这对于 WebSocket 聊天、大文件上传/下载、复杂的 AI 计算接口是必须的,否则连接会频繁闪断

  • proxy_send_timeout

Nginx 向后端发送数据的最长等待时间

  • proxy_connect_timeout

Nginx 连接后端服务器的最长等待时间

C 9. nginx.conf 文件高亮与保存自动格式化

  • 安装 vscode 插件实现语法高亮: NGINX Configuration Language Suppor
  • 保存自动格式化

在 settings.json 文件新增配置

"[nginx]": {    "editor.defaultFormatter": "ahmadalli.vscode-nginx-conf"}

tip:在 vscode 打开文件,点击鼠标右键,然后点击 格式化文档 ,vscode 工具会自动添加 settings.json 配置文件

10. nginx 相关报错

  • 接口报这个错误: net::ERR_INCOMPLETE_CHUNKE

改 nginx 缓冲区大小就可以了

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

最新文章

热门文章

本栏目文章