1、安装
-
安装依赖
yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
-
创建临时目录
mkdir /var/temp/nginx -p
-
配置安装模块信息
./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
-
编译并安装
make && make install
2、进程模型
master 用来接收指令控制 worker ,worker 进程才是实际对外提供服务的进程
-
master 主进程
接收指令,发送给 worker 由worker 执行如:
nginx -s reload
-
worker 工作进程
#user nobody; #可调整工作进程数,worker_ processes的值通常不会大于服务器中cpu的核心数量,这样做的原因是为了尽力让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况 worker_processes 2;
3、NGINX处理web请求解析机制
多个 worker工作进程通过【抢占机制】分配该【客户端】的处理权
3.1 工作线程的分配
-
主动激活1个 worker 来处理请求,配置方式:
accept_mutex on
-
唤醒所有的 worker 线程通过互斥锁【accept_mutex】的方式抢夺该次请求
accept_mutex off
http://t.zoukankan.com/vinsent-p-12834838.html
3.2 epoll模型
3.3 工作线程链接数的配置
events {
#默认每个工作进程都使用 epoll
use epoll;
#每个工作进程的最大连接数
worker_connections 1024;
}
4、配置结构
4.1配置文件详解
4.2 pid文件丢失
-
pid文件所在文件夹不存在:创建 /var/run/nginx/ 文件夹可解决
nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
-
pid文件存在问题:重新创建 pid文件
执行:
nginx -c /root/nginx/conf/nginx.conf
重新创建pid文件
5、常用命令
- nginx -s stop 快速关闭nginx。不友好,生产环境不建议使用
- nginx -s quit 等待所有已链接关闭后才关闭
- nginx -t 检查配置文件
- nginx -s reload 重启
- nginx -V 展示nginx的详细信息:安装的环境参数
- nginx -c 设置nginx的配置文件
6、日志切割
6.1 手动切割日志
-
创建切割脚本 cut_my_log.sh
#!/bin/bash LOG_PATH="/var/log/nginx/" #切割格式,%Y-%m-%d+%H:%M 这个具体到分钟。不同的格式切割不同的时间单位 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`
-
添加文件的可执行权限
chmod 777 cut_my_log.sh
-
手动执行切割脚本
6.2 定时切割日志
#安装定时任务软件
yum install crontabs
#查看定时任务
crontab -l
#添加定时任务
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
#重启定时任务
service crond restart
crontabs的常用命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
crontab -e // 编辑任务
crontab -l // 查看任务列表
7、 匹配规则
- alias 别名
浏览器访问 /static 实际从 /home/test 下去访问文件
/static {
alias /home/test;
}
-
精确匹配 【=】 号开头
访问路径必须是 【/lhy/index.html】,如下访问的文件路径是:/app/lhy/index.html
location = /lhy/index.html { root /app; }
-
正则表达式 【~】 开头
以下示例匹配以 .img、.png、.jpeg、.pdf结尾的访问路径(~必须与正则相邻中间不能有空格),访问的实际文件地址为:
http://192.168.2.118:8080/wdfs.png-------->/app/img/wdfs.png
-
*区分大小写
location ~*\.(img|png|jpeg|pdf){ root /app/img; }
-
不加*不区分大小写
location ~\.(img|png|jpeg|pdf){ root /app/img; }
-
-
以某个字符开头 【^~】开头
http://192.168.2.118:8080/lhy/img/文件-笔记本.png-------------->/app/lhy/img/文件-笔记本.png
location ^~ /lhy/img{ root /app/; }
8、跨域解决方案
listen 8080;
server_name localhost;
#charset koi8-r;
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
##允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
##允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
##允许请求的header
add_header 'Access-Control-Allow-Headers' *;
#access_log logs/host.access.log main;
9、防盗链配置
#对源站点验证
valid_referers *.imooc.com;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
10、web应用集群
官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
#使用 upstream 配置上游服务器,这里的test_servers是集群名称,可以自命名
#默认使用轮询的方式进行分配
upstream test_servers{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
#通过 proxy_pass 将请求代理到上游的集群中, http://test_servers; 必须和upstream配置集群名称一直
server{
listen 90;
server_name location;
location / {
proxy_pass http://test_servers;
}
}
10.1负载均衡
-
轮询 使用 weight关键字进行设置;
upstream test_servers{ server 127.0.0.1:8081 weight=1; server 127.0.0.1:8082 weight=2; server 127.0.0.1:8083 weight=5; }
-
ip_hash 根据客户端的ip进行分配到不同的节点上(iphash使用的是客户端ip的前面3位用来hash计算如:客户端92.168.2.118,用来计算的是192 ),使用iphash时某个节点需要下线时应使用down标记,而不是删除这个节点否则将导致iphash的重新计算,从而引发缓存失效、会话信息不正确等问题。2种不通的hash算法:
upstream test_servers{ ip_hash; server 127.0.0.1:8081 ; server 127.0.0.1:8082 ; server 127.0.0.1:8083 ; }
-
Hash(ip) % node_counts = index 服务器的增加或减少会导致所有的请求定位到不同的节点
-
一致性hash:
按照常用的hash算法来将对应的 ip 哈希到一个具有232次方个桶的空间中,即0~(232)-1的数字空间中。现在我们可以将这些数字头尾相连,想象成一个闭合的环形。
将object1、object2、object3、object4四个对象(服务器节点)通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。如下图:
客户端发起请求时,ip将发送的就近的机器上,当机器节点增加或者删除时,只有少部分ip会收到影响
-
-
url_hash 将请求的url进行hash计算分发到不通的机器节点上
upstream tomcats { # url hash hash $request_uri; server 192.168.1.173:8080; server 192.168.1.174:8080; server 192.168.1.175:8080; }
-
最少连接数 转发到最新链接的机器节点上
upstream tomcats { least_conn; server 192.168.1.173:8080; server 192.168.1.174:8080; server 192.168.1.175:8080; }
10.2 upstream 指令参数
-
max_conns 配置最大连接数
改属性是用来限制同时连接到upstream负载上的单个服务器的最大连接数,作用是可以对单个服务器进行限流,防止服务器超负荷运转.默认值为0,则表示没有限制,超过限制的请求会返回502
upstream test_servers{ server 127.0.0.1:8081 max_conns=20; server 127.0.0.1:8082 max_conns=10; server 127.0.0.1:8083 max_conns=23; }
-
slow_start=time(商业版本)
对配置了权重的某个节点,将权重在指定的时间内从0提升至配置的权重
upstream test_servers{ server 127.0.0.1:8081 weight=2; server 127.0.0.1:8082 weight=2; server 127.0.0.1:8083 weight=6 slow_start=60s; }
-
down
标识某个节点的状态为不可用
upstream test_servers{ server 127.0.0.1:8081 down; server 127.0.0.1:8082; server 127.0.0.1:8083; }
-
backup
指定该节点是备用机,当其他的正常节点全部挂了以后该节点才能被访问
upstream test_servers{ server 127.0.0.1:8081 backup; server 127.0.0.1:8082; server 127.0.0.1:8083; }
-
max_fails、fail_timeout
fail_timeout 时间段内该节点失败次数达到指定数,这个时间段内节点会被标记为不可用。这个时间段后又会分配请求过来
upstream test_servers{ server 127.0.0.1:8081 max_fails=2 fail_timeout=15s; server 127.0.0.1:8082; server 127.0.0.1:8083; }
10.3 keepalive 提高吞吐量
keepalive 保存的是从 Nginx到上游服务器之间的连接数,避免每次请求都使用请求转发去打开新的链接
upstream tomcats {
server 127.0.0.1:8082;
server 127.0.0.1:8083;
#设置长连接处理的数量
keepalive 32;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
#设置长连接http版本为1.1
proxy_http_version 1.1;
#清除connection header 信息
proxy_set_header Connection "";
}
}
10.4 缓存
-
浏览器缓存 expires 指令进行配置
#请求到资源后10s后缓存过期 location ^~ /lhy/img{ root /app/; expires 10s; } #指定某个时间后过期 location ^~ /lhy/img{ root /app/; expires @22h10m; }
-
反向代理缓存
# proxy_cache_path 设置缓存目录 # keys_zone 设置共享内存以及占用空间大小 # 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; location / { proxy_pass http://tomcats; # 启用缓存,和keys_zone一致 proxy_cache mycache; # 针对200和304状态码缓存时间为8小时 proxy_cache_valid 200 304 8h; }
11、Nginx高可用集群(自建机房)
11.2 Keepalived
Keepalived 可以虚拟出一个网卡,虚拟一个VIP。多个节点中的Keepalived 可以选举出一个对外提供服务的ip,这个ip是Keepalived集群种唯一的。当 Keepalived 挂了以后,集群中会选举出一个新的master 主节点。
-
一主一备2台服务器,缺点是在主机没有挂时,备用机永远不会使用。存在资源浪费
-
设置2个虚拟ip,因为互为主备关系,某一个ip挂了以后都会转发到宁外一个ip节点上
12、Nginx高可用集群(云端服务器)
12.1 双机主备
由云服务厂商提供一个负载均衡ip(公网ip),再将云服务器绑定到负载均衡ip上。然后域名解析解析到负载均衡ip(公网ip)上
12.2 双主热备
将域名绑定2个负载均衡ip(公网ip),客户端进行请求时,DNS轮询(DNS转发可以进行权重配置)转发到某一个ip上。因为互为主备关系,某一个ip挂了以后都会转发到宁外一个ip节点上
DNS 域名解析绑定多个ip(这个ip是负载均衡服务器的ip)