Nginx 配置文件详解
-
main: 全局配置
-
event: 配置工作模式以及连接数
-
http: http 模块相关配置
- server 虚拟主机配置,可以有多个
- location 路由规则,表达式
- upstream 集群,内网服务器
- server 虚拟主机配置,可以有多个
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 端口
- 将 ssl 证书 *.crt 和 私钥 拷贝到
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](image-20201103222613654.png)
配置 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
文件中,但是随着时间的推移,这个文件得内容会越来越多,体积会越来越大,不便于运维人员查看,所以 我们可以通过把这个大的日志文件切割为多份不同的小文件日志。 切割规则可以以 天
为单位,如果每天有很多得日志得话,则可以按需求以每半天,或者每小时对日志切割一下。
- 创建一个 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`
- 为
cut_my_log.sh
添加可执行得权限:
chmod +x cut_my_log.sh
- 测试日志切割后的结果
./cut_my_log.sh
- 安装定时任务
yum install crontabs
- 添加定时任务
# 查看已经添加得定时任务
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 ~ 59 | 0 ~ 23 | 1 ~ 31 | 1 ~ 12 | 1 ~ 7 | 2019 / 2020/ 2021/… |
常用表达式:
- 每分钟执行
*/1 * * * *
- 每日凌晨执行(每天晚上 23:59)
59 23 * * *
- 每日凌晨一点执行:
0 1 * * *