文章目录
Nginx安装
# 安装各种依赖
yum -y install autoconf automake make
yum -y install gcc gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel
# 源码安装
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -zxvf nginx-1.15.8.tar.gz
cd nginx-1.15.8
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
export PATH=$PATH:/usr/local/nginx/sbin/
# yum安装
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
# 安装echo插件
# 注:安装插件需要关停Nginx服务后安装才会生效
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
tar -zxvf v0.61.tar.gz
cd nginx-1.15.8 ##进入 nginx 源码目录,准备重新配置 nginx
./configure --add-module=/usr/local/src/echo-nginx-module-0.61/
make && make install
# 源码方式安装的Nginx卸载,直接删除安装目录的文件夹即可
rm -rf /usr/local/nginx
# 安装OpenResty
wget https://openresty.org/download/openresty-1.15.8.1.tar.gz
tar -zxvf openresty-1.15.8.1.tar.gz
##选择需要的插件启用, --with-Components 激活组件,--without 则是禁止组件
./configure --without-http_redis2_module --with-http_iconv_module make && make install
##加入 path 路径
vi /etc/profile
export PATH=$PATH:/usr/local/openresty/nginx/sbin/
##生效配置
source /etc/profile
Nginx常用命令
./nginx -c nginx.conf 的文件。如果不指定,默认为 NGINX_HOME/conf/nginx.conf
./nginx -s stop 停止
./nginx -s quit 退出
./nginx -s reload 重新加载 nginx.conf
./nginx -h 查看帮助文档
Nginx日志管理
1.日志格式参数
参数名 | 含义 |
---|---|
$remote_addr | 客户端的ip地址(代理服务器,显示代理服务ip) |
$remote_user | 用于记录远程客户端的用户名称(一般为“-”) |
$time_local | 用于记录访问时间和时区 |
$request | 用于记录请求的url以及请求方法 |
$status | 响应状态码,例如:200成功、404页面找不到等 |
$body_bytes_sent | 给客户端发送的文件主体内容字节数 |
$http_user_agent | 用户所使用的代理(一般为浏览器) |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer | 可以记录用户是从哪个链接访问过来的 |
- 错误日志不能自定义格式
2.按日期切割日志
-
设置Linux系统定时器
crontab -e #编辑定时器 0 0 * * * root /usr/local/nginx/logs/ngx_log.sh crontab -l #使定时器生效 # 可能会出现以下情况 You have new mail in /var/spool/mail/root #系统提示 cat /var/spool/mail/root #查看提示 /bin/sh: root: command not found #出现报错,此时删除cron表达式中的root即可
-
准备shell脚本
#!/bin/bash #设置日志文件存放目录 LOGS_PATH=/usr/local/nginx/logs #备分文件名称 YESTERDAY=$(date -d "yesterday" +%Y%m%d%H%M) #重命名日志文件 mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log ## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件 kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
-
修改shell脚本为可执行文件
chmod 774 ngx_log.sh
Nginx虚拟主机
Nginx在server中使用域名+端口来确定一个虚拟主机,并可以设置其中一个server为默认的虚拟主机
server {
# 默认虚拟主机是当客户端通过IP地址或进行访问的时候生效
listen 80 default_server;
server_name xx.com;
location / {
root /usr/local/nginx/html;
index b.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
匹配规则
server_name指令可以定义为精准匹配、通配符、正则表达式。
- 当通过名称匹配到多个虚拟主机后,按以下优先级顺序选择
- 精准匹配
- 以*号开头最长的通配符名称
- 以*号结束最长的通配符名称
- 第一个匹配到的正则名称(以配置文件中出现的顺序)
- 通配符名称中的*号只能在名称的开始或结尾,并且只能在.号外,例如,“www.*.example.org”和“w*.example.org”都是无效的通配符名称,但是以上名称可以通过正则表达式来表示。
特殊的通配符名称:“.example.org”既可以精准匹配“example.com”,也可以匹配通配符名称“*.example.org”
- 正则表达式,使用PCRE
官方文档地址:http://nginx.org/en/docs/http/server_names.html
Nginx路由location
1.语法规则
符号 | 含义 |
---|---|
= | 表示精确匹配 |
^~ | 表示url以某个常规字符串开头(禁止正则匹配) |
~ | 表示区分大小写的正则匹配 |
~* | 表示不区分大小写的正则匹配 |
!和!* | 分别表示区分大小写不匹配及不区分大小写不匹配的正则 |
/ | 用户所使用的代理(一般为浏览器) |
2.匹配规则
- 精准匹配命中时,停止location动作,直接走精准匹配
- 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条
- 如果最长的那一条普通匹配声明为非正则,直接走此条匹配,停止location
- 如果最长的那一条普通匹配不是非正则,继续往下走正则location
- 按代码顺序执行正则匹配,当第一条正则location命中时,停止location
3.执行过程
url=域名+端口+path+param
- 域名+端口 ===>定位虚拟主机
- path与location部分匹配,path=匹配path1+剩余path2
- root:在目录里找path1+path2路径,【静态服务器】
- alias:在目录里找path2路径;若url以/结尾,认为是目录,执行该目录下的index.html文件;否则认为path路径到达指定文件
- proxy_pass;当ip:port/时,转发ip+port+path2;当ip:port时,转发ip+port+path1+path2
4.rewrite使用
rewrite regex replacement [flag]
-
flag=【break/last/redirect/permanent】
-
regex是正则表达式
-
replacement是替换值
-
flag是后续处理标识
- break-内部重定向,path值被更新,rewrite层面的命令中断。原控制流程逻辑不变往下走
- last-内部重定向,path值被更新,rewrite层面的命令中断。控制流程刷新,重新进行整个location匹配
- redirect/permanent-外部重定向(301永久重定向/302临时重定向),Nginx流程结束,返回http响应到浏览器,页面url更新
- flag为空-内部重定向,path值更新,rewrite层命令继续,到最后一个rewrite完毕,刷新控制流程,重新进行location匹配
-
index关键字原理:当请求的文件在目录下存在时,会重新触发location,如果匹配到对应的location,则执行location,否则返回index后的文件
location /aa.html { rewrite ^/ /a.html break;##停止指令,流程不变往下走 rewrite ^/ /b.html break; root /etc/nginx/html/; }
Nginx负载均衡
-
关键字:upstream
-
负载策略:
-
ip_hash
# 根据客户端访问的IP进行哈希值计算后,将访问固定到某一个server upstream ${upstream_name} { ip_hash; server ip1:port1; server ip2:port2; }
-
轮询
upstream ${upstream_name} { server ip1:port1; server ip2:port2; }
-
权重
upstream ${upstream_name} { server ip1:port1 weight=1; server ip2:port2 weight=2; }
-
-
在server后配置down可以标识server下线
upstream ${upstream_name} { server ip1:port1 weight=1 down; server ip2:port2 weight=2; }
跨域
#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin http://a.com;
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
#允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
#P3P支持跨域cookie操作
add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';
#OPTIONS类的请求,是跨域先验请求
if ($request_method = 'OPTIONS') {
#204代表ok
return 204;
}
防盗链
# https://nginx.org/en/docs/http/ngx_http_referer_module.html
# Syntax: valid_referers none | blocked | server_names | string ...;
# Default: —
# Context: server, location
valid_referers *.com; # 对referer进行校验
压缩gzip
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Syntax: gzip on | off;
# Default: gzip off;
# Context: http, server, location, if in location
gzip on; # 启用gzip压缩,默认是off,不启用
# 对js、css、jpg、png、gif格式的文件启用gzip压缩功能
gzip_types application/javascript text/css image/jpeg image/png image/gif;
gzip_min_length 1024; # 所压缩文件的最小值,小于这个的不会压缩
gzip_buffers 4 1k; # 设置压缩响应的缓冲块的大小和个数,默认是内存一个页的大小
gzip_comp_level 1; # 压缩水平,默认1。取值范围1-9,取值越大压缩比率越大,但越耗cpu时间
https
# https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate
server {
listen 443 ssl;
server_name example.com;
ssl_certificate example.com.rsa.crt;
ssl_certificate_key example.com.rsa.key;
ssl_certificate example.com.ecdsa.crt;
ssl_certificate_key example.com.ecdsa.key;
...
}
# 生成自签证书
# 安装openssl
# 生成私钥
openssl genrsa -des3 -out server.key 4096 -- 密码1234
# 生成CSR
openssl req -new -key server.key -out server.csr
# 去除私钥口令
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key --密码1234
# 生成证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
LVS思想(keepalived)
# 1.关闭 selinux,打开/etc/sysconfig/selinux,设置其中值SELINUX=disabled
# 2.安装依赖包
yum -y install libnl libnl-devel libnfnetlink-devel
# 3.源码安装keepalived
wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
# 4.配置/etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL ####keepalived的唯一标识
}
vrrp_script chk_http_port {
script "/etc/nginx/chk_nginx.sh" #心跳执行的脚本
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33 ##系统网上名,可以使用ip addr命令查看
virtual_router_id 51 ##组名,参与此虚拟ip的机器配置一样的值
priority 200 ##优先级,数值大的优先级高,组内最高的胜出
advert_int 1 ##心跳检测1s一次
authentication { ##心跳检测1s一次
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.244.200 ##虚拟的ip
}
}
# 5.脚本
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` ##统计nginx进程数,若为0,表明nginx被杀
if [ $A -eq 0 ];then
#重启nginx
/usr/local/openresty/nginx/sbin/nginx
#nginx重启失败,则停掉keepalived服务,进行v_ip转移
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
#杀掉,v_ip就漫游到另一台机器
killall keepalived
fi
fi
问题
- Nginx为什么快?
http://www.aosabook.org/en/nginx.html
- Linux的IO模式及原理?Epoll,poll,select?
https://segmentfault.com/a/1190000003063859
- Nginx是多进程,为什么只有一个pid文件?
- 官方文档:https://nginx.org/en/docs/control.html#reconfiguration
- pid文件保存的是master进程的pid,使用ps命令可以看到NGINX有多个进程
- worker进程详情查看命令:ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep ‘(nginx|PID)’
修改hosts文件不生效
谷歌浏览器、系统都会缓存dns,因此需要全部清除后再重启浏览器即可。
win10电脑清除系统dns缓存:
ipconfig /flushdns
谷歌浏览器清除dns缓存:
- 打开浏览器,输入
chrome://net-internals/#dns
,点击Clear host cache
即可; - 有事可能还需要清除Sockets缓存,
chrome://net-internals/#sockets
,点击Flush socket pools
即可。
Linux开放防火墙端口
# 查看防火墙状态
[root@localhost ~]# systemctl status firewallld
# 查看防火墙开放的端口
[root@localhost ~]# firewall-cmd --list-ports
22/tcp 80/tcp 8080/tcp 8888/tcp
# 开启防火墙端口
[root@localhost ~]# firewall-cmd --add-port=443/tcp --permanent
success
# 重启防火墙
[root@localhost ~]# systemctl restart firewalld
[root@localhost ~]# firewall-cmd --list-ports
22/tcp 80/tcp 8080/tcp 8888/tcp 443/tcp