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. 创建服务脚本
1
vi /usr/lib/systemd/system/nginx.service
  1. 服务脚本内容
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. 重新加载系统服务
1
systemctl daemon-reload
  1. 启动服务
1
systemctl start nginx.service
  1. 开机自启
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 运行日志

基本运行原理

image-20220424022053512

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_hash

根据客户端的 ip 地址转发同一台服务器,可以保持回话

  • least_conn

最少连接数访问

  • url_hash

根据用户访问的 url 定向转发请求

  • fair

根据后端服务器响应时间转发请求

动静分离

  • 配置后端服务的反向代理
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
  • yum 安装
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