Nginx 补充

2022-11-14 20:11:46 浏览数 (1)

有一段时间没更新笔记,主要是偷懒了,其次没有输入形不成输出

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

0 人点赞