Nginx 从入门到实战
发表于更新于
字数总计:2.2k阅读时长:8分钟阅读量: 上海
Nginx 的安装
本文 Linux 环境基于 centos7
版本区别
常用版本分为四大阵营
编译安装
这里下载的是 nginx-1.21.6.tar.gz
解压后编译安装
1 2 3 4 5 6 7 8
| BASH # 解压 tar zxvf nginx-1.21.6.tar.gz -C ./ cd nginx-1.21.6 # 执行配置脚本(不执行默认会安装在该目录) ./configure --prefix=/usr/local/nginx # 安装 make && make install
|
如果出现警告或报错
一般是缺少依赖的问题
1 2 3 4 5 6 7 8 9
| BASH # 安装gcc yum install -y gcc # 安装perl库 yum install -y pcre pcre-devel # 安装zlib库 yum install -y zlib zlib-devel # 重新执行安装 make && make install
|
安装成系统服务
- 创建服务脚本
1
| vi /usr/lib/systemd/system/nginx.service
|
- 服务脚本内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| GRADLE
[Unit] Description=nginx - web server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop ExecQuit=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
|
- 重新加载系统服务
- 启动服务
1
| systemctl start nginx.service
|
- 开机自启
1
| systemctl enable nginx.service
|
Nginx 基础使用
目录结构
进入 Nginx
的主目录可以看到这些文件夹
1 2
| MIPSASM client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
|
其中这几个文件夹在刚安装时是没有的, 主要用来存放运行过程中的临时文件
1 2
| EBNF client_body_temp fastcgi_temp proxy_temp scgi_temp
|
- conf:用来存放配置文件
- html:用来存放静态文件的默认目录 html、css 等
- sbin:nginx 的主程序
- logs:nginx 运行日志
基本运行原理
Nginx 配置
最小配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| CRMSH
# 默认为1,表示开启一个业务进程 worker_processes 1;
events { # 单个业务进程可接受连接数 worker_connections 1024; }
http { # 引入http mime类型 include mime.types; # 如果mime类型没匹配上,默认使用二进制流的方式传输。 default_type application/octet-stream; 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。 sendfile on;
keepalive_timeout 65;
# 虚拟主机 vhost server { # 监听端口号 listen 80; # 域名、主机名 server_name localhost;
# 匹配路径 location / { root html; # 文件根目录 index index.html index.htm; # 默认页名称 }
# 报错编码对应页面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
}
|
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
server_name 匹配规则
我们需要注意的是 server_name
匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
可以在同一个 server_name
中配置多个域名
1 2
| ABNF server_name abc.com abc123.com;
|
可以通过 *
通配符来模糊匹配多个域名,可以在开始和结尾使用
1 2
| NGINX server_name *.abc.com abc.*
|
1 2
| APACHE server_name ~^[0-9]+\.abc\.com$
|
反向代理
通过关键字 proxy_pass
关键字来指定一个服务器地址(ip/域名)
1 2 3 4
| NGINX location / { proxy_pass http://www.baidu.com/; }
|
负载均衡
1 2 3 4 5 6 7 8 9
| NGINX upstream app { server 192.168.88.102:80; server 192.168.88.103:80; }
location / { proxy_pass http://app; }
|
负载均衡策略
默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求
- 权重(weight)
- down:表示当前的主机暂时不参与负载
- weight:默认为 1,weight 越大,负载的权重就越大
- backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
1 2 3 4 5 6
| NGINX upstream app { server 192.168.88.102:80 weight=10 down; server 192.168.88.103:80 weight=1; server 127.0.0.1:8060 weight=1 backup; }
|
根据客户端的 ip 地址转发同一台服务器,可以保持回话
最少连接数访问
根据用户访问的 url 定向转发请求
根据后端服务器响应时间转发请求
动静分离
1 2 3 4
| NGINX location / { proxy_pass http://127.0.0.1:8080; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| NGINX
location /css { root /usr/local/nginx/static; index index.html index.htm; }
location /images { root /usr/local/nginx/static; index index.html index.htm; }
location /js { root /usr/local/nginx/static; index index.html index.htm; }
# 正则匹配 location ~*/(css|img|js) { root /usr/local/nginx/static; index index.html index.htm; }
|
location 配置规则
location 前缀
- / 通用匹配,任何请求都会匹配到
- = 精准匹配,不是以指定模式开头
- ~ 正则匹配,区分大小写
- ~* 正则匹配,不区分大小写
- ^~ 非正则匹配,匹配以指定模式开头的 location
location 匹配规则
- 多个正则
location
直接按书写顺序匹配,匹配成功后就不会往下匹配
- 普通(非正则)
location
会一直往下,直到找到匹配度最高的(最大前缀匹配)
- 当普通
location
与正则 location
同时存在,如果正则匹配成功,则不会再执行普通匹配
- 所有类型
location
存在时,=匹配
> ^~匹配
> 正则匹配
> 普通(最大前缀匹配)
alias 与 root
1 2 3 4 5 6
| root` 用来设置根目录,而 `alias` 在接受请求的时候在路径上不会加上 `location NGINX location /css { alias /usr/local/nginx/static/css; index index.html index.htm; }
|
- alias 指定的目录是准确的,即 location 匹配访问的 path 目录下的文件直接是在 alias 目录下查找的;
- root 指定 的目录是 location 匹配访问的 path 目录的上一级目录,这个 path 目录一定要是真实存在 root 指定目录下的;
- 使用 alias 标签的目录块中不能使用 rewrite 的 break(具体原因不明);另外,alias 指定的目录后面必须要加上”/“符 号!!
- alias 虚拟目录配置中,location 匹配的 path 目录如果后面不带”/“,那么访问的 url 地址中这个 path 目录后 面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果 location 匹配的 path 目录后面加上”/“,那么访问的 url 地 址中这个 path 目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
- root 目录配置中,location 匹配的 path 目录后面带不带”/“,都不会影响访问。
URLRewrite
rewirte 语法格式及参数语法:
rewrite
是实现 URL 重写的关键指令,根据 regex (正则表达式)
部分内容,重定向到 replacement
,结尾是 flag
标记。
1 2 3
| XML rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flag标记
|
- 关键字:其中关键字
rewrite
不能改变
- 正则:正则表达式语句进行规则匹配
- 替代内容:将正则匹配的内容替换成
replacement
- flag 标记:
rewrite
支持的 flag
标记
rewrite 参数的标签段位置:server、location、if
flag 标记说明:
- last:本条规则匹配完成后,继续向下匹配新的 location URI 规则
- break:本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址
- permanent:返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址
防盗链配置
1 2
| NGINX valid_referers none | blocked | server_names | strings ....;
|
- none:检测
Referer
头域不存在的情况
- blocked:检测
Referer
头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 http://
或 https://
开头
- server_names:设置一个或多个
URL
,检测 Referer
头域的值是否是这些 URL
中的某一个。
使用 curl 测试
1 2 3 4
| AWK curl -I http://192.168.44.101/img/logo.png
# -I 表示只显示响应的头信息
|
带引用
1 2
| AWK curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png
|
高可用配置
安装 Keepalived
下载地址:https://www.keepalived.org/download.html#
1 2 3 4 5 6 7 8 9 10 11
| ERLANG-REPL # 解压之后通过命令安装 ./configure
# 如遇报错提示 configure: error: !!! OpenSSL is not properly installed on your system. !!! !!! Can not include OpenSSL headers files. !!!
# 安装依赖 yum install openssl-devel
|
1 2
| CMAKE yum install keepalived
|
配置
使用 yum
安装后的配置文件在 /etc/keepalived/keepalived.conf
最小配置
主机:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ANGELSCRIPT
! Configuration File for keepalived global_defs { router_id lb101 } vrrp_instance vansys { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.44.200 } }
|
从机:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| ANGELSCRIPT
! Configuration File for keepalived global_defs { router_id lb100 } vrrp_instance vansys { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.44.200 } }
|
启动服务
1 2
| CRMSH systemctl start keepalived
|