Nginx简介
1、Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
2、反向代理
正向代理:通过代理服务器进行网络访问,比如VPN,相当于代理访问。
反向代理:反向代理服务器和目标服务器可以看作是一个服务器,相当于请求转发。
3、负载均衡
增加服务器的数量,将请求转发按照一定规则转发到不同的服务器上。
4、动静分离
反向代理服务器可以部署静态资源,一般前端项目就可以部署在nginx上面,将动态资源和静态资源分开部署。
5、高可用
Nginx安装
下载nginx安装包 nginx-1.23.3.tar.gz
![](https://i-blog.csdnimg.cn/blog_migrate/9a71a05aca7aaa0258d3683fb64b3ee3.png)
2、下载安装相关依赖素材
安装pcre依赖:把压缩文件放在linux系统中,进入压缩文件存放目录,解压文件tar -xvf pcre-8.37.tar.gz,进入解压之后的目录cd pcre,输入./configure,输入make && make install编译安装。(查看版本号pcre-config --version)
安装其他的依赖:如果已经联网:使用yum命令yum -y install make zlib alib-devel gcc-c++ libtool openssl openssl -devel
3、安装nginx
解压缩nginx包,进入解压缩目录。执行./configure,输入make && make install
也可以安装的时候初始化文件路径:
./configure --prefix=/usr --with-stream --pid-path=/var/run/nginx.pid --conf-path=/etc/nginx/nginx.conf
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/var/run/nginx/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
cd /usr/local/nginx/sbin 启动nginx:./nginx
查看开放端口号:
firewall-cmd --list-all
设置开放端口号:
firewall-cmd --add-service=http -permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙:
firewall-cmd -reload
Nginx常用操作命令
进入nginx的目录:cd /usr/local/nginx
查看nginx版本号:./nginx -v
启动nginx:./nginx
关闭nginx:./nginx -s stop
重启nginx:./nginx -s reload
判断nginx是否准备就绪:./nginx -t
Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
配置文件的组成
第一部分:全局块
从文件开始到events块之间的内容比如worker processes
第二部分:events块
主要影响nginx服务器与用户的网络连接
比如worker_connections 1024 支持的最大连接数
第三部分:http块
http全局块:包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
service块:这块和虚拟主机有密切的关系
全局service块
location
Nginx配置实例
反向代理
实例一
达成效果
![](https://i-blog.csdnimg.cn/blog_migrate/7d150af2b96f85c447466a6c207d8fa7.png)
2、nginx请求转发的配置
将server_name改成ip192.168.17.129
在localtion块里面增加proxy_pass http://127.0.0.1:8080
实例二
1、达成效果
nginx监听9001
![](https://i-blog.csdnimg.cn/blog_migrate/60b6dd8e3288be17d95b7b728f09618d.png)
2、nginx请求转发的配置
增加一个server块
server{ listen 9001; server_name 192.168.17.129; location ~/edu/{ proxy_pass http://127.0.0.1:8080 } location ~/vod/{ proxy_pass http://127.0.0.1:8081 } }
开放对外访问的端口号sudo firewall-cmd --add-port=8081/tcp --permanent...
负载均衡
1、达成效果
浏览器输入地址http://192.168.17.129/edu/a.html,负载均衡效果,平均分配到8080和8081端口中
2、nginx请求转发的配置
先加上upstream块
upstream myserver{
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
修改location里的配置
location / {
proxy_pass http://myserver;
...
}
nginx分配策略
轮询(默认):每个请求按照时间顺序逐一分配到不同服务器,如果有个服务器down,能自动剔除
weight:权重越高分配到的几率更大比如server 192.168.17.129:8080 weight=5;
ip_hash:每个请求按照访问ip的hash结果分配,这样每个方可固定访问一个后端服务器,可以解决session的问题
fair(第三方):按后端服务器的响应时间进行分配。
动静分离
![](https://i-blog.csdnimg.cn/blog_migrate/e9d5cfcadbaa87a94e080320869ab8a7.png)
修改nginx配置文件
以统一接入管控维护系统为例
upstream myproject {
ip_hash;
server 10.238.0.92:9753; ##后端服务地址
server 10.238.0.93:9753;
}
server {
listen 8399;
server_name 10.127.128.39; ##前端服务地址
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /home/app/acce; ##解压后的前端文件目录
index index.html index.htm;
}
location /control{
proxy_pass http://myproject;
}
location匹配规则
~开始正则
*不区分大小写
~*/(css|js|html)
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
高可用集群
问题
![](https://i-blog.csdnimg.cn/blog_migrate/d944c7eca8073e40fa9d6b6889be0b0d.png)
高可用
![](https://i-blog.csdnimg.cn/blog_migrate/10112f846305edfdd96ad3bf5e328444.png)
需要两台nginx服务器,需要keepalived服务
keepalived安装:
使用yum命令:yum install keepalived -y
位置:/etc/keepalived 配置文件keepalived.conf
2.完成高可用配置(主从模式)
! Configuration File for keepalived
global_defs { #全局定义部分
notification_email { #设置报警邮件地址,可设置多个
acassen@firewall.loc #接收通知的邮件地址
}
notification_email_from test0@163.com #设置 发送邮件通知的地址
smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25)
smtp_connect_timeout 30 #设置 连接 smtp server的超时时间
router_id LVS_DEVEL #主机标识,用于邮件通知
vrrp_skip_check_adv_addr
vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root
enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。
}
检测存活脚本
vrrp_script chk_nginx_service { #VRRP 脚本声明
script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本
interval 3 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 3 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
user keepalived_script #执行脚本的用户或组
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.130
}
track_script { #脚本监控状态
chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务
notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务
notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务;
}
virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称
state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备)
interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 90 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.119.131
}
}
virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #后端调试算法(load balancing algorithm)
lb_kind DR #LVS调度类型NAT/DR/TUN
#persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.119.120 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
real_server 192.168.119.121 80 {
weight 1 #权重,最大越高,lvs就越优先访问
TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
connect_timeout 10 #10秒无响应超时
retry 3 #重连次数3次
delay_before_retry 3 #重连间隔时间
connect_port 80 #健康检查realserver的端口
}
}
}
3.nginx存活检测脚本chk_nginx.sh配置
#!/bin/bash
status=$(ps -C nginx --no-heading|wc -l)
if [ "${status}" = "0" ]; then
# 尝试启动一次
systemctl start nginx
# 再次检查ngixn 进程
status2=$(ps -C nginx --no-heading|wc -l)
if [ "${status2}" = "0" ]; then
# 关闭 keepalived
systemctl stop keepalived
fi
fi
4.给脚本一个可执行权限
# 给脚本一个 可执行的权限
chmode +x /etc/keepalived/nginx_check.sh
5.启用keepalived和nginx
systemctl start keepalived.service
Nginx日志配置
设置access_log
访问⽇志主要记录客⼾端的请求。客⼾端向Nginx服务器发起的每⼀次请求都记录在这⾥。客⼾端IP,浏览器信息,referer,请 求处理时间,请求URL等都可以在访问⽇志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。
语法
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问⽇志
access_log off; # 关闭访问⽇志
path 指定⽇志的存放位置。
format 指定⽇志的格式。默认使⽤预定义的combined。
buffer ⽤来指定⽇志写⼊时的缓存⼤⼩。默认是64k。
gzip ⽇志写⼊前先进⾏压缩。压缩率可以指定,从1到9数值越⼤压缩⽐越⾼,同时压缩的速度也越慢。默认是1。
flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写⼊⽇志。
另外,还有⼀个特殊的值off。如果指定了该值,当前作⽤域下的所有的请求⽇志都被关闭。
作用域
可以应⽤access_log指令的作⽤域分别有http,server,location,limit_except。也就是说,在这⼏个作⽤域外使⽤该指 令,Nginx会报错。 以上是access_log指令的基本语法和参数的含义。下⾯我们看⼀⼏个例⼦加深⼀下理解。
基本语法
access_log /var/logs/nginx-access.log
该例⼦指定⽇志的写⼊路径为/var/logs/nginx-access.log,⽇志格式使⽤默认的combined。
access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m
该例⼦指定⽇志的写⼊路径为/var/logs/nginx-access.log,⽇志格式使⽤默认的combined,指定⽇志的缓存⼤⼩为32k,⽇志 写⼊前启⽤gzip进⾏压缩,压缩⽐使⽤默认值1,缓存数据有效时间为1分钟。
使⽤log_format⾃定义⽇志格式
Nginx预定义了名为combined⽇志格式,如果没有明确指定⽇志格式默认使⽤该格式:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
如果不想使⽤Nginx预定义的格式,可以通过log_format指令来⾃定义
log_format name [escape=default|json] string ...;
name 格式名称。在access_log指令中引⽤。
escape 设置变量中的字符编码⽅式是json还是default,默认是default。
string 要定义的⽇志格式内容。该参数可以有多个。参数中可以使⽤Nginx变量。
下⾯是log_format指令中常⽤的⼀些变量:
$remote_addr #记录访问网站的客户端地址
$remote_user #远程客户端用户名
$time_local #记录访问时间与时区
$request #用户的http请求起始行信息
$status #http状态码,记录请求返回的状态码,例如:200、301、404等
$body_bytes_sent #服务器发送给客户端的响应body字节数
$http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。
$http_user_agent #记录客户端访问信息,例如:浏览器、手机客户端等
$http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置
设置error_log
错误⽇志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息
语法
配置错误⽇志⽂件的路径和⽇志级别
error_log file [level];
Default:
error_log logs/error.log error;
第⼀个参数指定⽇志的写⼊位置。
第⼆个参数指定⽇志的级别。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。可以看到其取值范围 是按紧急程度从低到⾼排列的。只有⽇志的错误级别等于或⾼于level指定的值才会写⼊错误⽇志中。默认值是error。
基本用法
error_log /var/logs/nginx/nginx-error.log
它可以配置在:main, http, mail, stream, server, location作⽤域。 例⼦中指定了错误⽇志的路径为: /var/logs/nginx/nginx-error.log ,⽇志级别使⽤默认的error。
日志切割
手动切割
利用shell脚本文件
现有的日志文件存在access.log文件中,随着时间的推移,这个文件会越来越大,不便于运维人员查看,可以把这个大的日志文件切割成若干个小的文件,切割规则可以以时间为单位。
创建一个shell可执行文件:cut_my_log.sh,内容:
#!/bin/bash
#此脚本用于自动分割Nginx的日志,包括access.log和error.log
#每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件
#Nginx日志文件所在目录
LOG_PATH="/var/log/nginx"
RECORD_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'
为cut_my_log.sh添加可执行权限:
chmod +x cut_my_log.sh
运行脚本文件,进行切割
./cut_my_log
自动切割
安装定时任务
yum install crontabs
crontab -e 编辑并且添加一行新的任务(按分钟):
*/1 * * * */usr/local/nginx/sbin/cut_my_log.sh
00 00 *...按天切割
重启定时任务
service crond restart
![](https://i-blog.csdnimg.cn/blog_migrate/770ec1e9059549dfba1fe6ceb347ead8.png)
使用logrotate工具
创建nginx配置文件
vi /etc/logrotate.d/nginx
文件内容如下
/usr/local/nginx/logs/access.log {
su root root
create 0664 nginx root
daily
dateext
rotate 30
missingok
notifempty
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
测试
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
配置定时任务
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx
补充说明:(全局参数)
weekly : 每周执行回滚,或者说每周执行一次日志回滚
rotate: 表示日志切分后历史文件最多保存离现在最近的多少份 [rəʊˈteɪt] 旋转
create : 指定新创建的文件的权限与所属主与群组
dateext : 使用日期为后缀的回滚文件 #可以去/var/log目录下看看
单独配置信息:
/var/log/btmp { 指定的日志文件的名字和路径
missingok 如果文件丢失,将不报错
monthly 每月轮换一次
create 0664 root utmp 设置btmp这个日志文件的权限,属主,属组
minsize 1M 文件超过1M进行回滚,所以大家要知道它不一定每个月都会进行分割,要看这个文件大小来定
rotate 1 日志切分后历史文件最多保存1份,不含当前使用的日志
其它参数说明:
monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
notifempty: 如果日志文件为空,轮循不会进行。
create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
/var/lib/logrotate/status中默认记录logrotate上次轮换日志文件的时间。原文链接:https://blog.csdn.net/weixin_39566578/article/details/111509796
注意:
copytruncate 如果没有这个选项的话,操作方式:是将原log日志文件,移动成类似log.1的旧文件, 然后创建一个新的文件。 如果设置了,操作方式:拷贝原日志文件,并且将其变成大小为0的文件。
区别是如果进程,比如nginx 使用了一个文件写日志,没有copytruncate的话,切割日志时, 把旧日志log->log.1 ,然后创建新日志log。这时候nginx 打开的文件描述符依然时log.1,由没有信号通知nginx 要换日志描述符,所以它会继续向log.1写日志,这样就不符合我们的要求了。 因为我们想切割日志后,nginx 自动会向新的log 文件写日志,而不是旧的log.1文件
解决方法有两个:
1.向上面的nginx 切割日志配置,再postrotate里面写个脚本
postrotate # 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
这样就是发信号给nginx ,让nginx 关闭旧日志文件描述符,重新打开新的日志文件描述,并写入日志
Nginx优化
1、把worker数量设置成cpu的数量是最合适的。
2、发送请求,占用woker的几个连接数?——2或者4个
3、nginx有一个master,有四个worker,每个worker支持最大的连接数是1024,支持最大的并发数是多少?——1024*4/(2|4)