Nginx 集群安装以及常用配置详解开机自启动

Nginx 配置文件详解

  • main: 全局配置

  • event: 配置工作模式以及连接数

  • http: http 模块相关配置

    • server 虚拟主机配置,可以有多个
      • location 路由规则,表达式
      • upstream 集群,内网服务器

Nginx 搭建静态资源服务器

根据上面的目录。 我们在 http 模块中的 配置一个虚拟主机就可以了

 server {
	listen				90;				# 监听 90 端口
	server_name			localhost;
	
	location / { 						# 配置根路径访问
		root	/home/foodie-shop		# 映射哪一个文件
		index	index.html				# 默认根路径访问哪一个页面
	}
	
	location /static {					# 访问图片方式:http://localhost:90/static/img/ face1.png
		#root	/home
		alias	/home/imooc				# 别名 home 
	}
	
	location /imooc {					# 访问图片方式:http://localhost:90/imooc/img/face1.png
		root 	/home
	}
}

Nginx 中 location 匹配规则

Nginx 精确匹配
server {
	listen					91;
	server_name				localhost;
	
	location = / {						# 使用 = 精确匹配。 当访问时 只可以访问根路径, 其他的识别不了
		root	html;
		index	imooc.html index.html;
	}
}
Nginx 正则匹配
 server {
	listen					92;
	server_name				localhost;
	
	location ~* \.(GIF|png|bmp|jpg|jpeg) {				# 正则表达式。* 代表不区分大小写 , 只允许访问 这些格式的文件  不携带 * 的话,是不会忽略大小写的
		root	html;
		index	imooc.html index.html;
	}
}
Nginx 文件压缩功能。提高传输效率
http: {
	gzip				on;				# 开启 gzip 压缩功能。提高传输效率,节约网络贷款
	gzip_min_length	1;	1;				# 限制最小压缩。  小于一个字节的文件,就不会压缩了
	gzip_comp_level		3;				# 设置压缩比(压缩级别)。取值 1 ~ 9 ,  文件越大,压缩越多,但是cpu使用会更多
	gzip_types			text/plain application/javascript application/x-javascript text/css application/xml text/javascript 
										# 设置需要压缩文件的类型 
}

Nginx 日志目录

/var/log/nginx/access.log 	 # nginx 接受请求时得日志
/var/log/nginx/error.log	 # nginx 发生错误时得日志

Nginx 的跨域

server {
   listen				90;
   server_name			localhost;
   # 允许带上cookie 请求
   add_header			'Access-Control-Allow-Origin' *;
   # 允许请求的方法 GET/POST/PUT/DELETE
   add_header			'Access-Control-Allow-Methods' *;
   # 允许请求的header
   add_header			'Access-Control-Allow-Headers' *;
}

Nginx防盗链配置支持

server {
	listen				90;
	server_name			localhost;
	# 允许带上cookie 请求
	add_header			'Access-Control-Allow-Origin' *;
	# 允许请求的方法 GET/POST/PUT/DELETE
	add_header			'Access-Control-Allow-Methods' *;
	# 允许请求的header
	add_header			'Access-Control-Allow-Headers' *;
	# 对源站点验证
	valid_referers *.imooc.com;
	# 非法引入会进入下方判断
	if ($invalid_referer) {
		return 404;
	} 
	location / {
		...
	}
}

以上如果进入判断,直接返回 404, 如果不是非法引入,则继续往下走其他的配置。 比如 location

Nginx 配置集群

# 配置上游服务器集群
upstream tomcats {
	server 	192.168.1.173:8080;
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
	server 	192.168.1.176:8080;
}

server {
	listen			80;
	server_name		www.tomcats.com;
	
	location / {
		proxy_pass	http://tomcats;		  		# 配置反向代理服务器
	}
}

Nginx 负载均衡轮询

以上的默认配置就是轮询机制

Nginx 负载均衡 加权轮询

# 配置上游服务器集群
upstream tomcats {
	server 	192.168.1.173:8080 weight=1;		# weight 权重, 默认为 1 
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080 weight=2;
	server 	192.168.1.176:8080 weight=5;
}	

Nginx 负载均衡 IP-HASH

  • 算法 hash(ip) % node_counts = index
  • 当使用 ip_hash 需要下机一个服务的时候,只能使用 dwon . 不能直接删除
  • 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。
upstream tomcats {
	ip_hash;													# 开启 hash 负载均衡策略
	
    server 	192.168.1.173:8080;
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}

Nginx 负载均衡 URL_HASH

  • 算法 hash(url) % node_counts = index
upstream tomcats {
	hash $request_uri;													# 开启 url_hash 算法
	
    server 	192.168.1.173:8080;
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}

Nginx 负载均衡 least_conn

  • 根据你的那一台服务比较少。就会把请求分发到接受请求最少得服务器上
upstream tomcats {
	least_conn;
	
    server 	192.168.1.173:8080;
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}

Nginx 中 upstream 指令

  • max_conns : 限制服务器的最大连接数, 默认值为 0 , 则不限制, 用于保护避免过载,可以起到限流作用
upstream tomcats {
	server 	192.168.1.173:8080 max_conns=2;
	server 	192.168.1.174:8080 max_conns=2;
	server 	192.168.1.175:8080 max_conns=2;
}
  • slow_start : 如果在 upstream 中只有一台 server , 则该参数失效。不适用与 hash 和 random 的负载均衡策略上的, 收费功能!!!
upstream tomcats {
	server 	192.168.1.173:8080 weight=6 slow_start=60s;  		# 在服务器启动 60 s 之后,他的权重会慢慢增长到 6 
	server 	192.168.1.174:8080 weight=2;
	server 	192.168.1.175:8080 weight=2;
}
  • down : 用于标记服务节点不可用:
upstream tomcats {
	server 	192.168.1.173:8080 down; 							# 使用这个参数后,表示该服务不可用
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}
  • backup : 备用状态。 表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到,参数不能使用在 hash 和 random load balancing 中。
upstream tomcats {
	server 	192.168.1.173:8080 backup; 							# 使用这个参数后,表示该服务不可用
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}
  • max_fails : 最大失败次数。 达到最大失败次数,会认为当前的 server ,就已经宕机了。用户的请求就不会请求到 该 server 上

  • fail_timeout : 失败超时时间

upstream tomcats {
	server 	192.168.1.173:8080 max_fails=2 fail_timeout=1s;						
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}

Nginx keepalive 指令

upstream memcached_backend {
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
	
	keepalive 32;											# 设置长连接处理的数量
}
http {
	server {
		listen					90;
		server_name				localhost
		
		location / {
			proxy_pass			http://memcached_backend;	# 反向代理地址
			
			proxy_http_version	1.1;						# http 版本
			proxy_set_header	Connection "";				# 清除connection header 信息
		}
	}
}

Nginx 配置浏览器缓存

  • expires [time] 设置过期时间
  • expires @[time] @22h30m 晚上十点钟30分 文件过期
  • expires -[time] 设置文件提前过期
  • expires epoch 设置不使用缓存
  • expires off 关闭nginx 的缓存策略。 但是浏览器会有自己的缓存策略
  • expires max 最大的过期时间,就相当于永不过期
server {
	listen						90;
	server_name					localhost;
	
	location /static {
		alias	/home/imooc;
		# expires	10s;										# 设置此location /static 下的文件缓存 10 s 过期
		# expires 	@22h30m;									# 设置每天的晚上十点钟30分文件过期
		# expires 	-1h;										# 设置文件提前一小时过期。 就是没有用缓存
		# expires 	epoch										# 关闭缓存
		# expires 	off											# 关闭nginx 的缓存策略。 但是浏览器会有自己的缓存策略
		# expires 	max											# 最大的过期时间,就相当于永不过期
	}
}

Nginx 配置反向代理缓存

  • proxy_cache : 开启并使用反向代理缓存
upstream tomcats {
	server 	192.168.1.173:8080;						
	server 	192.168.1.174:8080;
	server 	192.168.1.175:8080;
}

# proxy_cache_path:设置缓存保存的目录  
# keys_zone: 共享空间。 名字为 mycache 大小为 5mb
# max_size: 设置缓存大小 
# inactive:设置缓存超出时间,则缓存则会自动清理
# use_temp_path: 关闭临时目录, 开启可能会造成 nginx 性能影响
proxy_cache_path	/usr/local/nginx/upstream_cache	keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;

server {
	listen						80;
	server_name					www.tomcats.com;
	
	proxy_cache					mycache;						# 开启并使用缓存
	proxy_cache_valid			200 304 8h;						# 针对200,304状态码缓存设置过期时间 
	
	location / {
		proxy_pass				http://tomcats;
	}
}

Nginx 配置SSL证书提供 HTTPS 访问

需要先申请一个 SSL 证书。 我在腾讯云申请的 SSL 免费证书

  • 安装SSL模块, 需要在 nginx 中配置 https , 就必须安装 ssl 模块, 也就是 http_ssl_module
    • 进入到 nginx 的解压目录 /home/software/nginx-1.16.1
    • 新增 ssl 模块(原来的模块需要保留)
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module
  • 编译 安装
make 

make install
  • 配置 HTTPS
    • 将 ssl 证书 *.crt 和 私钥 拷贝到 /usr/local/nginx/conf 目录中
    • 新增 server 监听 443 端口
server {
	listen					443;
	server_name				www.fllday.cn;
	
	ssl						on; 										# 开启 ssl
	ssl_certificate			1_www.fllday.cn_bundle.crt;					# 配置 ssl 证书
	ssl_certificate_key		2_www.fllday.cn_com.key;					# 配置 ssl 证书秘钥
	
	ssl_session_cache		shared:SSL:1m;								# ssl 回话 cache
	ssl_session_timeout		5m;											# ssl 会话 超时时间
	
	# 配置加密套件, 写法遵循 openssl 标准
	ssl_protocols			TLSvl TLsv1.1 TLSv1.2						
	ssl_ciphers 			ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
	ssl_prefer_server_ciphers on;
}

Nginx 高可用 HA

  • Nginx 高可用集群架构 Keepalived 双机主备

    • 解决单点故障
    • 组件免费
    • 实现高可用 HA 机制
    • 基于 VRRP 协议
  • 虚拟路由冗余协议 VRRP

    • Virtual Router Redundancy Protocol
    • 解决内网单机故障的路由协议
    • 构建有多个路由器 MASTER BACKUP
    • 虚拟IP - VIP (Virtual IP Address)
  • Keepalived 安装

wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz

tar -zxvf keepalived-2.0.20.tar.gz

cd keepalived-2.0.20

yum -y install libnl libnl-devel								# 出现 ipv6 的警告时

./configure --prefix=/usr/local/keepalived --sysconf=/etc		# prefix 安装目录  sysconf 核心配置文件位置

make && make install

whereis keepalived  											# 查找 keepalived 文件位置 

cd /usr/local/keepalived										# keepalived 安装目录

cd /etc/keepalived												# keepalived 配置文件目录
  • Keepalived 配置文件解析
! Configuration File for keepalived

global_defs {
   router_id keep_fllday_171
   # 路由id: 当前安装 keepalived 的标识符,全局唯一的
}
# 计算机节点
vrrp_instance VI_1 {
    # master 表示的状态,当前 nginx 的主节点, master主 backup 备
    state MASTER
    # 当前实例绑定的网卡 eth0 网卡名称
    interface eth0
    # 虚拟路由id 保证主备节点一致
    virtual_router_id 51
    # 优先级权重 优先级高,在master 死掉以后,等级越高,越容易成为 Master
    priority 100
    # 主备之间同步检查的时间间隔,默认 1 秒
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟 ip 地址
    #虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress{
    	192.168.1.161
    }
}

将Keepalived 注册为系统服务

# 进入到安装包的位置
cd /home/software/keepalived-2.0.20
# 查看目录
ll 
aclocal.m4  bin          ChangeLog   config.status  CONTRIBUTORS  doc      install-sh       keepalived.spec.in  Makefile.am  README     TODO
ar-lib      bin_install  compile     configure      COPYING       genhash  keepalived       lib                 Makefile.in  README.md
AUTHOR      build_setup  config.log  configure.ac   depcomp       INSTALL  keepalived.spec  Makefile            missing      snap

# 进入到 keepalived/etc/目录中 
cd keepalived/etc 
# 查看目录
init  init.d  keepalived  Makefile  Makefile.am  Makefile.in  openrc  sysconfig

# 拷贝 init.d 目录中的 keepalived 到 /etc/init.d/
cp init.d/keepalived /etc/init.d/

# 拷贝 sysconfig/keepalived 到 /etc/sysconfig/
cp sysconfig/keepalived /etc/sysconfig/ 

# 重启 etc 
systemctl daemon-reload 

# 启动 停止 查看 keepalived 服务
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl status keepalived.service

Nginx 使用Keepalived 实现双机主备高可用

按照之前的方式在另一台虚拟机安装上 keepalived

# 进入到 /etc/keepalived 删除配置文件
rm -rf keepalived.conf
# 重新编辑 配置文件
vim keepalived.conf

# -------------- keepalived.conf start --------------
global_defs {
   router_id keep_fllday_172
   # 路由id: 当前安装 keepalived 的标识符,全局唯一的
}
# 计算机节点
vrrp_instance VI_1 {
    # master 表示的状态,当前 nginx 的主节点, master主 backup 备
    state BACKUP								# 作为备用机
    # 当前实例绑定的网卡 eth0 网卡名称
    interface eth0
    # 虚拟路由id 保证主备节点一致
    virtual_router_id 51
    # 优先级权重 优先级高,在master 死掉以后,等级越高,越容易成为 Master
    priority 80
    # 主备之间同步检查的时间间隔,默认 1 秒
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟 ip 地址
    #虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress{
    	192.168.1.161
    }
}

# -------------- keepalived.conf end --------------

:wq! # 报存文件

# 进入到 /usr/local/keepalived/
cd /usr/local/keepalived/sbin
# 启动 
./kepalived

keepalived 配置 Nginx 自动重启

  • 创建检查 nginx 是否存活的脚本
# 进入到 
cd /etc/keepalived/  
# 创建脚本
vim check_nginx_alive_or_not.sh 

# -------------- 脚本 start ------------------

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断 nginx 是否宕机, 如果宕机了 就重启
if [ $A -eq 0 ];then
	/usr/local/nginx/sbin/nginx
	# 等待一小会儿 继续检查,如果没有启动成功,则停止 keepalived 使用使用备用机
	sleep 3
	if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
		killall keeplived
	fi
fi

# -------------- 脚本 end --------------------
:wq! 		# 保存脚本

# 配置权限
chmod +x check_nginx_alive_or_not.sh  
  • 修改 keepalived.conf 文件
global_defs {
   # 路由id: 当前安装 keepalived 的标识符,全局唯一的
   router_id keep_fllday_171
}

vrrp_script check_nginx_alive {
	script "/etc/keepalived/check_nginx_alive_or_not.sh"
	# 每隔两秒钟运行一次脚本
	interval 2 
	# 如果脚本运行成功,则升级权重  + 10
	weight 10
}

# 计算机节点
vrrp_instance VI_1 {
    # master 表示的状态,当前 nginx 的主节点, master主 backup 备
    state MASTER
    # 当前实例绑定的网卡 eth0 网卡名称
    interface eth0
    # 虚拟路由id 保证主备节点一致
    virtual_router_id 51
    # 优先级权重 优先级高,在master 死掉以后,等级越高,越容易成为 Master
    priority 100
    # 主备之间同步检查的时间间隔,默认 1 秒
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    	# 追踪 nginx 脚本
    	check_nginx_alive	
    }
    # 虚拟 ip 地址
    #虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress{
    	192.168.1.161
    }
}

# 退出保存
:wq!

# 重启keepalived 

KeepAlived 双主热备原理架构

image-20201103222613654

配置 DNS 轮询双主虚拟 IP

通过腾讯云或者阿里云域名解析配置即可

实现双主热备

  • 修改 171 服务上的 keepalived 配置
! Configuration File for keepalived

global_defs {
   router_id keep_fllday_171
   # 路由id: 当前安装 keepalived 的标识符,全局唯一的
}
vrrp_script check_nginx_alive {
	script "/etc/keepalived/check_nginx_alive_or_not.sh"
	# 每隔两秒钟运行一次脚本
	interval 2 
	# 如果脚本运行成功,则升级权重  + 10
	weight 10
}

# 计算机节点
vrrp_instance VI_1 {
    # master 表示的状态,当前 nginx 的主节点, master主 backup 备
    state MASTER
    # 当前实例绑定的网卡 eth0 网卡名称
    interface eth0
    # 虚拟路由id 保证主备节点一致
    virtual_router_id 51
    # 优先级权重 优先级高,在master 死掉以后,等级越高,越容易成为 Master
    priority 100
    # 主备之间同步检查的时间间隔,默认 1 秒
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    	check_nginx_alive	
    }
    # 虚拟 ip 地址
    #虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress{
    	192.168.1.161
    }
}

# 计算机节点
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    	check_nginx_alive	
    }
    virtual_ipaddress{
    	192.168.1.162
    }
}
  • 修改 172 服务器 keepalived 配置文件
global_defs {
   # 路由id: 当前安装 keepalived 的标识符,全局唯一的
   router_id keep_fllday_172
}

vrrp_script check_nginx_alive {
	script "/etc/keepalived/check_nginx_alive_or_not.sh"
	# 每隔两秒钟运行一次脚本
	interval 2 
	# 如果脚本运行成功,则升级权重  + 10
	weight 10
}

# 计算机节点
vrrp_instance VI_1 {
    # master 表示的状态,当前 nginx 的主节点, master主 backup 备
    state BACKUP
    # 当前实例绑定的网卡 eth0 网卡名称
    interface eth0
    # 虚拟路由id 保证主备节点一致
    virtual_router_id 51
    # 优先级权重 优先级高,在master 死掉以后,等级越高,越容易成为 Master
    priority 100
    # 主备之间同步检查的时间间隔,默认 1 秒
    advert_int 1
    # 认证授权的密码,防止非法节点的进入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    	# 追踪 nginx 脚本
    	check_nginx_alive	
    }
    # 虚拟 ip 地址
    #虚拟出来的ip,可以有多个(vip)
    virtual_ipaddress{
    	192.168.1.161
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
    	check_nginx_alive	
    }
    virtual_ipaddress{
    	192.168.1.162
    }
}

修改完之后,保存重启。就可以达到 双主热备的效果了

Nginx 常用命令

./nginx -s stop   	# 强制关闭
    
./nginx -s quit		# nginx 退出

./nginx -t 			# 检测nginx 得配置文件是否有问题

./nginx -v			# 查看nginx 当前得版本号
    
./nginx -V			# 查看nginx 安装时得配置

./nginx -?			# 查看 nginx 得命令行帮助

./nginx -c 			# 设置启动时得配置文件

./nginx -s reload 	# 重启nginx 

Nginx 日志切割(手动)

默认得日志都会存在于 /var/log/nginx/access.log 文件中,但是随着时间的推移,这个文件得内容会越来越多,体积会越来越大,不便于运维人员查看,所以 我们可以通过把这个大的日志文件切割为多份不同的小文件日志。 切割规则可以以 为单位,如果每天有很多得日志得话,则可以按需求以每半天,或者每小时对日志切割一下。

  1. 创建一个 shell 可执行文件: cut_my_log.sh 内容为:
#!/bin/bash
LOG_PATH="/var/log/nginx"
RCORD_TIME=$(date -d "yesterday" + %y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
# 向nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`
  1. cut_my_log.sh 添加可执行得权限:
chmod +x cut_my_log.sh
  1. 测试日志切割后的结果
./cut_my_log.sh
  1. 安装定时任务
yum install crontabs
  1. 添加定时任务
# 查看已经添加得定时任务
crontab -l

# 添加定时任务
crontab -e

# 配置定时任务
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh 

# 重启定时任务
service crond restart

# 常用定时任务命令
service crond start    	# 启动服务
service crond stop 		# 关闭服务
service crond restart 	# 重启服务
service crond reload 	# 重新载入配置
crontab -e 				# 编辑任务
crontab -l				# 查看任务列表

定时任务表达式:

Cron 表达式是: 分为 5 或 6 个域, 每个域代表一个含义。如下所示:

星期几年(可选)
取值范围0 ~ 590 ~ 231 ~ 311 ~ 121 ~ 72019 / 2020/ 2021/…

常用表达式:

  • 每分钟执行
*/1 * * * *
  • 每日凌晨执行(每天晚上 23:59)
59 23 * * *
  • 每日凌晨一点执行:
0 1 * * * 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值