有一段时间没更新笔记,主要是偷懒了,其次没有输入形不成输出
1.安装
安装 Nginx 还是挺简单的,练习时可以使用 Docker 部署简单快捷
代码语言:javascript复制# 安装依赖(大部分机器都有依赖了)
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
# 解压、安装
tar zxvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
./configure --prefix=/usr/local/nginx # --prefix是指安装路径
make
make install
# 启停命令
cd /usr/local/nginx/sbin
./nginx # 启动
./nginx -s stop #快速停止
./nginx -s quit #优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload #重新加载配置
# 安装成系统服务,以后用 systemctl 启停
vi /usr/lib/systemd/system/nginx.service
[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
# 重新加载系统服务
systemctl daemon-reload
# 启动
systemctl start nginx.service
# 开机启动
systemctl enable nginx.service
2. 多进程模型
- /sbin/nginx 启动为主进程,读取并校验配置文件
- 主进程 fork 多个子进程,读配置缓存后负责解析请求
- reload 主进程杀死子进程,然后重 fork 进程,读取新的配置文件
多进程多线程
3. 最简配置文件
最简只需要配置 server 下的映射地址,让客户端能通过 Nginx 访问站点
代码语言:javascript复制# 业务子进程个数,配置cpu核数相关
worker_processes 1;
# 子进程的线程个数,不需要改
events {
worker_connections 1024;
}
http {
# 引入配置文件的地址,配置文件可分开配置
include mime.types;
default_type application/octet-stream;
# 数据零拷贝
sendfile on;
# 超时,后面两个方面讲
keepalive_timeout 65;
# 虚拟主机(vhost),可配多个站点,通过端口号不同区分
server {
listen 80;
server_name localhost; # 域名,主机名
# uri 匹配
location / {
root html; # 根目录配置在 html,是在这个目录下找文件
index index.html index.htm; # 默认页
}
# 错误页配置(这些错误码会转向 /50x.html,通过 location 配置到 html 目录)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4. 虚拟主机
虚拟主机可让一台 Web 服务器代理多个站点
4.1 端口区分
代码语言:javascript复制# 虚拟主机1(vhost),可配多个站点,通过端口号不同区分
server {
listen 80;
server_name localhost;
# uri 匹配
location / {
root /webapp/web1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 虚拟主机2(vhost)
server {
listen 81;
server_name localhost;
# uri 匹配
location / {
root webapp/web2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4.2 域名区分
本地配置hosts文件实现
代码语言:javascript复制# 虚拟主机1(vhost),可配多个站点
server {
listen 80;
server_name www.web1.com;
# uri 匹配
location / {
root /webapp/web1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 虚拟主机2(vhost)
server {
listen 80;
server_name www.web2.com;
# uri 匹配
location / {
root webapp/web2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
servername 的多种匹配方式
代码语言:javascript复制# 从前往后匹配 servername,匹配不上就找第一个
# 多域名、通配符、正则匹配
server {
listen 80;
server_name www.web2.com www.web3.com;
# uri 匹配
location / {
root webapp/web2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
5. 反向代理
隧道式代理:举例 nginx,请求和响应都经过 nginx
DR 代理:举例 LVS,请求经过 LVS ,响应直接返回给用户,不用再走一次 LVS
代码语言:javascript复制http {
# 群组
upstream httpd {
server 127.0.0.1:8080 weight=10 down; # 不参与负载
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=1 backup; # 其他机器忙,则打入
}
server {
listen 80;
server_name localhost;
location / {
# 形式一:配地址
proxy_pass http://www.baidu.com
# 形式二:配群组
proxy_pass http://httpd
# 上下关系是二选一
# root html;
# index index.html index.htm;
}
}
}
地址栏是不变的
6. URLRewrite
可以影藏后端真实地址
代码语言:javascript复制http {
upstream httpd {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
location / {
rewrite ^/user/list/([0-9] ).html$ /user/list?page=$1 break;
proxy_pass http://httpd
}
}
}
flag标记说明: last 本条规则匹配完成后,继续向下匹配新的location URI规则 break 本条规则匹配完成即终止,不再匹配后面的任何规则 redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
7. 防盗链
代码语言:javascript复制http {
server {
listen 80;
server_name localhost;
location / {
# 检测请求头的 referers 的地址是否包含
valid_referers 127.0.0.1;
if ($invalid_referer) {
return 403;
}
proxy_pass 127.0.0.1:8080
}
}
}
none:Referer 不存在的情况 blocked:Referer被防火墙或代理服务器删除或伪装(不以 http:// 或 https:// 开头) server_names:Referer 是否是多个 URL 中的某一个
8. 集群高可用
Keepalived 是安装在每台 Nginx 主机上的软件,能让虚拟 IP 在内网各机器间切换达到高可用,外界统一使用虚拟 IP 作为入口访问。
Keepalived 是监听各机器间自己的进程是否存在来选举,可以写定时脚本访问 Nginx ,若状态码不返回200则杀 Keepalived 进程来达到主备切换的目的
代码语言:javascript复制yum install -y keepalived
# 配置文件
vim /etc/keepalived/keepalived.conf
# 主、备只是 global_defs、state、priority不同
! Configuration File for keepalived
global_defs {
router_id nginx-01
}
vrrp_script check_nginx {
script "/usr/local/src/nginx_check.sh" # 脚本路径
interval 3 # 脚本执行间隔 3s
weight 2 # 若脚本检测结构为真,服务器权重 2
}
vrrp_instance VI_1 {
state MASTER # MASTER为主,BACKUP为备
interface eth0 # ip addr/ifconfig 可看网卡
virtual_router_id 51 # vrrp实例id 集群的实例id必须一致
priority 100 # 优先级
advert_int 1 # 心跳间隔,keepalived 集群的心跳检测
authentication {
auth_type PASS # 设置验证类型
auth_pass 1111 # 集群密码要设置一致
}
virtual_ipaddress {
192.168.10.200 # 虚拟IP,同网段没有使用的IP
}
track_script {
check_nginx # 检测脚本名称
}
}
检测脚本
代码语言:javascript复制vim /usr/local/src/nginx_check.sh
#! /bin/bash
# -C列出 nginx 指令相关进程(master/worker process)
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 启动 nginx 指定配置文件
sleep 2 # 睡眠 2 秒等待启动
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
systemctl stop keepalived.service # 杀死 Keepalived 服务,将vip漂移到其它节点
fi
fi
chmod 777 /usr/local/src/nginx_check.sh