Nginx是一款轻量级的Web服务器、反向代理服务器
设计思想类似 NodeJS,基于事件驱动的异步非阻塞处理
由于它的内存占用少,启动极快,高并发能力强,时常用于服务端的反向代理和负载均衡。
web服务器:负责处理和响应用户请求,一般也称为http服务器,如 Apache、IIS、Nginx
应用服务器:存放和运行系统程序的服务器,负责处理程序中的业务逻辑,如 Tomcat、Weblogic、Jboss(现在大多数应用服务器也包含了web服务器的功能)
代理分为正向代理与反向代理:正向代理隐藏真实客户端,反向代理隐藏真实服务端
首先说说正向代理,举个:A 找 C 借一笔钱,但两人关系不熟,肯定难借到。于是 A 就找 B 出面,因为 BC 是好朋友,很顺利的拿到钱了。这个例子中 B 向 C 隐藏了真正的借钱人,相当于正向代理。
VPN 也是一个正向代理的例子
反向代理在生活中也有例子:我要咨询手机通信问题,打电话到 10086,该系统会分配一个客服人员,我并不需要知道对方性别,年龄等因素,但他们都能提供给我专业服务。10086 总机对我隐藏了服务人员信息,相当于一个反向代理
反向代理,负载均衡。包括解决前端跨域问题
静态资源服务
API 服务,如OpenResty
…
查看 Nginx 信息 brew info nginx
常用文件路径(注意,以下为 M1 Mac 配置)
安装路径:/opt/homebrew/Cellar/nginx/1.23.0
默认配置路径:/opt/homebrew/etc/nginx/nginx.conf
操作 | 命令 |
---|---|
启动 | nginx |
热重启 | nginx -s reload |
停止 | nginx -s stop |
强制停止 | pkill -9 nginx |
下面是在前端本地开发中,使用 Nginx 解决浏览器跨域的配置,我们大致了解一下配置项,先不用关注具体含义:
#进程, 可更具cpu数量调整
worker_processes 1;
events {
#连接数
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#连接超时时间,服务器会在这个时间过后关闭连接。
keepalive_timeout 10;
# gizp压缩
gzip on;
# 直接请求nginx也是会报跨域错误的这里设置允许跨域
# 如果代理地址已经允许跨域则不需要这些, 否则报错(虽然这样nginx跨域就没意义了)
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
# srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机
server {
listen 80;
server_name localhost;
# 根路径指到index.html
location / {
root html;
index index.html index.htm;
}
# localhost/api 的请求会被转发到192.168.0.103:8080
location /api {
rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.0.103:8080; # 转发地址
}
# 重定向错误页面到/50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
worker_processes 8; # Nginx 进程数,建议按照CPU数目来指定,一般为它的倍数 (如:2个四核的CPU计为8)
worker_rlimit_nofile 65535; #一个Nginx 进程打开的最多文件描述符数目
worker_connections 65535;#每个进程允许的最多连接数
http {
sendfile on # 高效传输文件的模式 一定要开启
keepalive_timeout 65 # 客户端服务端请求超时时间
# 直接请求nginx也是会报跨域错误,这里设置允许跨域
# 如果代理地址已经允许跨域则不需要这些, 否则报错(虽然这样nginx跨域就没意义了)
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
server 模块是 http 模块中的一个子模块,用来定义一个虚拟访问主机。
当 ng 接收到请求后,会匹配 server 模块。
server {
listen 80; # 监听端口
server_name dev1-cd.hongsong.club; # 域名 Host
# path
location / {
proxy_pass http://127.0.0.1:10086/; # 代理配置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
上面的配置表示:当请求 samdd.club 时,会命中 Nginx 服务器 server 配置,代理到本地服务
server {
listen 80; #监听端口
server_name www.mingongge.com; #域名 Host 信息
location / {
root /www/www; #网站根目录
index index.html index.htm; #默认首页类型
deny 192.168.2.11; #禁止访问的ip地址,可以为all
allow 192.168.3.44; #允许访问的ip地址,可以为all
}
}
server {
listen 80;
server_name mingongge.com;
location /static {
root /wwww/web/web_static_site;
}
}
当生产环境中不同的项目在同一台服务器上,就可以用反向代理去做请求转发。
在前端本地开发,也会遇到浏览器跨域问题,可以用 Nginx 转发请求
http {
...
upstream product_server{
127.0.0.1:8081;
}
upstream admin_server{
127.0.0.1:8082;
}
upstream test_server{
127.0.0.1:8083;
}
server {
#默认指向 product_server
location / {
proxy_pass http://product_server;
}
location /product/{
proxy_pass http://product_server;
}
location /admin/ {
proxy_pass http://admin_server;
}
location /test/ {
proxy_pass http://test_server;
}
}
}
upstream server_pools {
# weigth 参数表示权重:权重越高,被分配到的几率越大
server 192.168.1.13:8989 weight=6;
server 192.168.1.11:8880 weight=5;
server 192.168.1.12:9990 weight=1;
}
server {
listen 80;
server_name samdd.com;
location / {
proxy_pass http://server_pools;
}
}
proxy_connect_timeout 90; # nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; # 后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; # 连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; # 代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; # proxy_buffers缓冲区
proxy_busy_buffers_size 64k; # 高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; # 设定缓存文件夹大小
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr; # 获取最初发起请求的客户端 IP 地址
proxy_set_header X-Real-IP $remote_addr; # 获取客户端真实IP
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for 变…remote_addr用逗号分开,如果没有 X-Forwarded-For 请求头,则 KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for等于remote_addr
$remote_addr 变量的值是客户端的 IP