Nginx(engine x)是一款的Web服务器、反向代理服务器,能够实现前端Web应用的部署、请求反向代理及负载均衡处理等功能。
特点
反向代理(Reverse Proxy)
正向代理(Forward Proxy)
在正向代理中,用户知道他们正在使用代理,并且知道代理到哪里;而在反向代理中,用户将请求的服务器理解为一个整体,并不能知道后边的请求是怎样流转的。
master process
)和多个工作进程(worker process
)。主进程并不处理网络请求,主要负责监控和管理工作进程。而工作进程则是实际处理网络请求的地方。Nginx
:2004年发布第一个版本v0.1.0,目前已更新至v1.25.2。Tengine
:由阿里推出,在Nginx基础上添加了很多功能和特性,并且已经在淘宝,天猫等各大应用得到应用,相对较稳定。但是并不能跟着Nginx官方版本同步升级。openresty
:支持lua脚本嵌入,可操作性更高。绿色为Nginx共有模块,橙色为Tengine模块,紫色为OpenResty模块
MAC使用Homebrew安装
安装Homebrew(如已安装,请跳过)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew -v # 查看Homebrew版本
brew update # 更新Homebrew
安装nginx
brew install nginx
查看版本&启动nginx
nginx -v #查看版本
nginx #启动nginx
nginx脚本及配置文件地址
配置文件目录
/opt/homebrew/etc/nginx
脚本位置/opt/homebrew/bin/nginx
Linux使用编译方式安装
环境安装
yum -y install gcc gcc-c++ autoconf automake make
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel make libtool
yum -y install openssl openssl-devel
nginx下载&编译
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 编译目录
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=nginx --group=nginx
make #编译
make install #安装
参数说明:
–prefix=/usr/local/nginx
#编译安装目录
–user=nginx
#所属用户nginx
–group=nginx
#所属组nginx
–with-http_stub_status_module
#该模块提供nginx的基本状态信息
–with-http_ssl_module
#支持HTTPS
nginx脚本及配置文件位置
跟编译目录阶段配置的-prefix有关
配置文件目录/usr/local/nginx/conf
脚本位置/usr/local/nginx/sbin/nginx
启动nginx
/usr/local/nginx/sbin/nginx
启动后在浏览器输入http://localhost:8080
,看到欢迎页面,说明安装启动成功
Nginx常用命令
nginx # 启动nginx
nginx -t # 检测nginx配置是否有误
nginx -s reload # 重载nginx
nginx -s quit # 从容停止
nginx -s stop # 强制停止
nginx -v # 查看版本
nginx -V # 查看nginx详细信息,包括安装位置,已安装的模块
nginx 总配置文件地址:/opt/homebrew/etc/nginx/nginx.conf
(MAC)、/usr/loca/nginx/conf/nginx.conf
(Linux),配置介绍如下:
#daemon on; # 启用或禁用守护进程模式。
#user nobody; # worker进程运行的用户和组,如果没有提供则使用nginx的master进程的用户和用户组。
worker_processes 1; # 定义worker进程数量一般和cpu核数一致,默认为1。
# 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别枚举:debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log error;
#pid logs/nginx.pid; # 存放nginx守护进程的pid文件路径。
events {
#accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on (惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。)
#multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
worker_connections 1024; # 定义一个worker进程能够同时连接的数量,默认为512.
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
# 定义log格式
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; # 使用定义好的log_format
client_max_body_size 20M; # 客户端允许上传的文件最大为20M
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块使用
#gzip on; #是否开启gzip压缩
server {
listen 8080; #监听的端口
server_name localhost; #监听的域名/ip,有多个server监听同一端口时可以通过server_name控制匹配到哪里,如果都没有匹配,则自动匹配端口的第一个
charset utf-8; #字符集设置
access_log logs/host.access.log main; #为该server设置log
#前端资源路径
location / {
root html; #静态文件路径,一般是前端的dist目录
index index.html index.htm; #index文件匹配
try_files $uri $uri/ =404; #定尝试查找静态文件的顺序。可以使用 try_files 指令来指定查找静态文件的顺序,如果找不到则返回指定的错误码。一般用于history模式
add_header Cache-Control "public, max-age=604800"; #通过add_header添加header,比如进行缓存控制
expires 7d; #缓存过期时间
etag on; #使用etag协商缓存
gzip on; #开启gizp压缩
gzip_types text/plain text/css application/javascript; #使用gzip的文件类型
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 接口反向代理
location ~^ /api {
proxy_pass http://127.0.0.1;
}
}
#负载均衡
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ^~ /vue {
alias /Users/chenjialin/Desktop/WorkSpace/test/vue-test/dist/; # 前端静态资源路径
index index.html index.htm;
}
location ~^ /api { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
proxy_send_timeout 1800s; # 响应超时时间
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem; # 证书位置
ssl_certificate_key cert.key; # 证书key位置
ssl_protocols TLSv1.2; # SSL 协议版本
ssl_session_timeout 5m;
location / {
root html;
index index.html index.htm;
}
}
# 80端口重定向到443
server {
listen 80;
server_name www.xxx.com;#填写绑定证书的域名
rewrite ^ https://$http_host$request_uri? permanent; # 将http转到https
}
# 引入外部文件
include hosts/*.conf;
}
模式 | 含义 |
---|---|
location = /uri |
= 表示精确匹配,只有完全匹配上才能生效 |
location ^~ /uri |
^~ 开头对URL路径进行前缀匹配,并且在正则之前 |
location ~ pattern |
开头表示区分大小写的正则匹配 |
location ~* pattern |
开头表示不区分大小写的正则匹配 |
location /uri |
不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 |
location / |
通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default |
匹配优先级:
注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:
location /a
与location /a/b
,如有请求http://localhost/a/b/file
将最终匹配到location /a/b
root和alias是nginx中配置资源路径的两种写法,但在使用时要注意他们的区别:
# root, 如果一个请求的URI是/a/a.html时,web服务器将会返回服务器上的/www/root/html/a/a.html的文件。
location ^~ /a/ {
root /www/root/html/;
}
# alias 如果一个请求的URI是/b/b.html时,web服务器将会返回服务器上的/www/root/html/b.html的文件。注意这里是直接访问html中的文件,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
location ^~ /b/ {
alias /www/root/html/;
}
upstream balanceUp {
server 127.0.0.1:3003;
server 127.0.0.1:3004;
server 127.0.0.1:3005;
}
upstream balanceUp2 {
server 127.0.0.1:3003 weight=1;
server 127.0.0.1:3004 weight=2;
server 127.0.0.1:3005 weight=3;
}
ip_hash
关键字进行配置,按照访问IP的hash结果分配,会导致来自同一IP的请求访问固定的一个后台服务器upstream balanceUp3 {
server 127.0.0.1:3003;
server 127.0.0.1:3004;
server 127.0.0.1:3005;
ip_hash;
}
状态控制
状态 | 概述 |
---|---|
down | 当前的server暂不参与负载均衡 |
backup | 预留的备份服务器,当其他服务器都挂掉的时候,启用 |
max_fails | 允许请求失败的次数 ,如果请求失败次数超过限制,则进过fail_timeout 时间后从虚拟服务池中kill掉该服务器 |
fail_timeout | 经过max_fails失败后,服务暂停时间,max_fails设置后,必须设置fail_timeout 值 |
max_conns | 限制最大的连接数,用于服务器硬件配置不同的情况下 |
upstream balanceUp4 {
server 127.0.0.1:3003 down;
server 127.0.0.1:3004 backup;
server 127.0.0.1:3005 max_fails=1 fail_timeout=10s;
}
# CORS
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS'
# 告诉服务端用户真实请求的IP
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr; # 存放用户的真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里