Nginx学习与安装
一、nginx概述
nginx是高性能的开源HTTP服务器。反向代理服务器、负载均衡器和HTTP缓存
典型的应用场景为:
(1)作为静态资源服务器(部署HTML、CSS、JS、图片等)
(2)作为 反向代理服务器,转发请求到后端应用服务器(如Tomcat、node.js)
(3) 实现负载均衡,分发请求到多个后端节点
(4) 作为API网关,处理请求过滤、认证、限流等功能。
(5)部署SSL/TLS证书,实现HTTPS加密传输
二、什么是反向代理
当我们部署项目的时候,突然就接触到了nginx,然后又提到了反向代理,所以反向代理到底是什么
首先说一下正向代理:
代理客户端帮助客户端访问目标目标服务器就是正向代理(如VPN访问境外网站),目标服务器不知道实际客户是谁
反向代理:
代理客户端代理目标服务器,客户端请求先发送到反向代理服务器,再由反向代理转
转发到后端真实服务器。所以客户端不知道实际处理请求的服务器是谁
两者逻辑正好相反
三、反向代理的流程
- 客户端向反向代理服务器(Nginx)发送请求(如
http://example.com/api
)。 - Nginx 根据配置的规则(如 URL 路径、域名)判断请求应转发到哪个后端服务器(如
192.168.1.100:8080
)。 - Nginx 将请求转发给后端服务器,并等待后端返回响应。
- 后端服务器处理请求后,将响应返回给 Nginx。
- Nginx 将响应转发给客户端,客户端感知不到后端服务器的存在。
四、Nginx反向代理配置示例+分析
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 82;server_name 118.170.91.230;#charset koi8-r;#access_log logs/host.access.log main;location / {root usr/local/myLibrary/dist;try_files $uri $uri /index.html;index index.html ie.html;# 禁用缓存确保获取最新HTMLadd_header Cache-Control "no-cache, no-store, must-revalidate";add_header Pragma "no-cache";34,0-1 Top
1.全局配置:
worker_processes 1;
events {worker_connections 1024;
}
(1)指定了Nginx使用1个工作进程
(2)每个工作进行最多处理1024个链接
2.HTTP块配置
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;
3.服务器代理配置
3.1 服务器静态资源服务
server {listen 82;server_name 118.178.91.230;location / {root /usr/local/myLibrary/dist;try_files $uri $uri/ /index.html;index index.html ie.html;add_header Cache-Control "no-cache, no-store, must-revalidate";add_header Pragma "no-cache";add_header Expires 0;}
}
(1)监听端口:82
(2)服务器名:118.178.91.230
(3)location / 处理所有请求:
root
指定静态文件根目录为/usr/local/myLibrary/dist
try_files
尝试按顺序查找文件:先找请求的URI,再找目录,最后回退到index.html(支持前端路由)index
指定默认索引文件添加了禁用缓存的HTTP头,确保客户端总是获取最新HTML
3.2 后端API代理(核心代理配置)
location /prod-api/ {proxy_pass http://118.178.91.230:8082/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
(1)匹配规则:所有以/prod-api/开通的请求都会被代理
(2)代理目标:
proxy_pass http://118.178.91.230:8082/
将请求转发到后端服务器118.178.91.230:8082
注意结尾的
/
很重要,它会将/prod-api/xxx
转换为http://后端服务器/xxx
(去掉/prod-api
前缀)
(3)请求头处理:
proxy_set_header Host $host
:保持原始请求的Host头X-Real-IP
:传递客户端真实IPX-Forwarded-For
:追加代理链信息
4.梳理代理的流程:
1.当请求到达Nginx(端口号82):
如果是/prod-api/开头的请求->转发到后端 http://118.178.91.230:8082/
其他请求->尝试从/usr/local/myLibrary/dist提供静态文件
2.代理转发时:
例如请求
http://118.178.91.230:82/prod-api/user
Nginx会将其转发到
http://118.178.91.230:8082/user
后端响应后,Nginx再将响应返回给客户端
3.静态文件服务:
当请求前端资源时,Nginx直接返回文件系统中的文件
对于前端路由(如React/Vue的单页应用),通过
try_files
回退到index.html
你有没有一个疑问,为什么再配置后端api代理时为什么要使用/prod-api/作为api请求前缀
由你的前端开发时设计决定的(我这里是基于若依框架开发的)
# 页面标题
VUE_APP_TITLE = 若依管理系统# 生产环境配置
ENV = 'production'# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
五、Nginx的安装
(1)创建路径
(2)解压
(3)配置编译编译方法
./configure
可以看到配置编译后的结果信息:
(4)编译nginx
在nginx源文件目录中直接运行 make指令
(5)安装nginx
(6)安装nginx
ok,nginx的工作区形成了
(7)更改nginx.conf配置文件