nginx介绍

nginx

安装

官方安装教程:http://nginx.org/en/linux_packages.html
下载源码包:wget path
安装:
1. 安装gcc环境
    yum install gcc-c++
2.安装PCRE库
    yum install -y pcre pcre-devel
3.zlib安装
    yum install -y zlib zlib-devel
4.ssl加密安装
    yum install -y openssl openssl-devel
5.创建临时目录
    mkdir /var/temp/nginx -p
6.配置参数
    ./configure --prefix=/usr/local/nginx \
 --pid-path=/var/run/nginx/nginx.pid \
 --lock-path=/var/lock/nginx.lock \
 --with-http_gzip_static_module \
 --http-client-body-temp-path=/var/temp/nginx/client \
 --http-fastcgi-temp-path=/var/temp/nginx/fastcgi 
 //安装过程可能报错,一般为缺少包,下方有参数解释:
7.安装:
    make & make install
8.启动:
    ./nginx/sbin/nginx
命令 解释
--prefix 指定nginx安装目录
--pid-path 指向nginx的pid
--lock-path 锁定安装文件,防止被恶意篡改或误操作
--error-log 错误日志
--http-log-path http日志
--with-http_gzip_static_module 启用gzip模块,在线实时压缩输出数据流
--http-client-body-temp-path 设定客户端请求的临时目录
--http-fastcgi-temp-path 设定fastcgi临时目录
--http-uwsgi-temp-path 设定uwsgi临时目录
--http-scgi-temp-path 设定scgi临时目录
--add-module 添加第三方外部模块
--conf-path 指定 nginx.conf 配置文件路径
--user nginx 工作进程的用户
--with-pcre 开启 PCRE 正则表达式的支持
--with-http_ssl_module 启动 SSL 的支持
--with-http_stub_status_module 用于监控 Nginx 的状态
--with-http-realip_module 允许改变客户端请求头中客户端 IP 地址
--with-file-aio 启用 File AIO

控制命令

#进程号默认存储在logs/nginx.pid
./nginx //启动nginx
kill -INT pid //快速关闭nginx
kill -QUIT pid //优雅关闭
kill -HUP pid  //重载配置文件,使用新配置运行
kill -USR1 pid //重读日志文件,即切换日志文件
kill -USR2 pid //平滑升级
kill -WINCH pid //平滑关闭旧进程
#控制命令
./nginx -s stop //快速关闭
./nginx -s quit //优雅关闭
./nginx -s reload //重载配置文件,使用新配置运行
./nginx -s reopen //重读日志文件,即切换日志文件
./nginx -t //测试配置文件是否出错

进程模型

master 进程:主进程,管理工作进程
worker 进程:工作进程,真正执行者,处理客户端连接

配置文件

worker_processes 1;#一般设置为cpu个数*cpu核心数
#日志级别info - notice - warn - error - crit
error_log logs/error.log info;

#pid路径
pid logs/nginx/pid;
events {
    use epoll; # 默认使用epoll,可以不配置
    worker_connections  1024;#一个工作进程允许的最大连接数

}
http {
    #导入外部文件配置
    include mime.types;
    #配置http服务
    
    sendfile on;#文件传输
    #tcp_nopush on; #累积统一处理
        
    gzip on; #开启压缩
    server {
        #虚拟主机配置
    }
}

虚拟主机

server {
        listen       80;#监听的端口

        server_name  hostname.com;#监听的主机名、域名、ip

        location / {
            root html;
            index index.html;
        }

        location / {
            alias /abc;
            index index.html;
        }
}

日志管理

date=`date -d yesterday +%Y%m%d` #获取时间
logpath=/usr/local/logs/xxx.log
bakpath=/data/logs/
bakname=xxx.log.$date
bakfilepath=$bakpath/$bakname
mv $logpath $bakfilepath
touch $logpath
/usr/local/nginx -s reopen

#设置linux定时任务即可

location配置

location = pattern #精准匹配,如果匹配中的如果是目录,则会重新进行匹配
location pattern #普通匹配,匹配度越高,则使用
location ~ pattern #正则匹配,~*表示不区分大小写
#匹配过程(默认匹配nginx目录下的html)
#精准匹配 > 正则匹配 > 普通匹配,精准匹配命中则不进行继续匹配,如果精准匹配未命中,则进行普通匹配,如果普通匹配有命中,则判断匹配度,以匹配度最高的为准,记忆匹配结果,如果有正则匹配,则以第一个匹配的为准,如果没有匹配则返回记忆结果

rewrite URL重写

if (cond){} #设定条件,在进行重写,if后面需要加空格,判断变量在前,条件在后,如果是文件判断则条件在前,变量在后,重写后重新匹配的url与开始的访问路径一致
set #设置变量
return #返回状态码
break #跳出rewrite,防止循环重定向
rewrite #重写url
#############################
rewrite regex rewriteaddr [break];#正则中如果有{},则需要将所有正则使用双引号包裹

gzip压缩

gzip on|off;#是否开启
gzip_buffers 32 4k|16 8k;#缓存块以及块大小
gzip_comp_level 1-9;#压缩级别,越大则压缩的越小,占用资源越大
gzip_disable pattern;#不压缩的规则
gzip_min_length 200;#最小压缩长度,即小于该值就不进行压缩
gzip_http_version 1.1;#压缩http协议版本
gzip_proxied #如果经过代理,设置缓存;
gzip_types text/plain application/xml;#压缩类型
gzip_vary on|off;#传输压缩标志

expires缓存

#在location和server中
expires 30s;#单位s,m,h,d等
#可以设置一个固定的时间 @20h30m 表示当天20点30分缓存到期
#设置一个过去的时间表示缓存已经过期 -1h
#expires epoch 没有使用缓存
#expires off 关闭缓存,即只使用浏览器缓存
#expires max 最大缓存时间,不过期
#会在浏览器本地缓存读取已缓存的内容

nginx缓存

#设置nginx缓存地址
# keys_zone 设置共享缓存以及占用的空间大小
# max_size 设置缓存的大小
# inactive 设置缓存保留的时间
# use_temp_path  关闭临时目录
proxy_cache_path /home/cache keys_zone=abcd:5m max_size=1g inactive=30s use_temp_path=off;

server {
    #其他配置
    #开启并使用上面设置的缓存
    proxy_cache abcd;
    #设置针对特定的状态码的缓存,并设置过期时间
    proxy_cache_valid 200 304 8h;
}

反向代理

#反向代理到其他服务器
proxy_pass url|upserver_name;
proxy_set_header X-Forwarded-For $remote_addr;

负载均衡

upstream up_name {
    [ip_hash;]#使用ip_hash算法进行负载均衡;
    [hash $request_uri;]#使用url进行hash计算的负载均衡
    [least_coun;]#最少连接负载均衡
    server address [params];
    # params: 
    #  weight=[1-9] 权重
    #  max_conns=number  最大连接数
    #  slow_start=time  缓慢提升权重,需要和wdight配合,开源版无法使用
    #  down  标识服务器停机
    #  backup  标识服务器为备用服务器
    #  max_fails=number  最大失败数,和fail_timeout配合使用
    #  fail_timeout=time  失败超时时间,和max_fails配合使用
    keepalive 32; 保持连接,http1.1
}

跨域问题

#server下和location下
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' *;
add_header 'Access-Control-Allow-Headers' *;

防盗链

valid_referers *.xxx.com;
if( $invalid_referer ){
    return 404;
}

https配置

#检测是否安装了ssl模块,如果没有安装的话,参考安装第三方模块
server {
    listen 443;
    server_name xxx;

    # 开启ssl
    ssl on;
    # 配置ssl证书,需要与nginx.conf在同一个目录,其他路径些相对路径或绝对路径
    ssl_certificate xxx.crt;
    # 配置证书秘钥,需要与nginx.conf在同一个目录
    ssl_certificate_key xxx.key;
    # ssl会话cache
    ssl_session_cache shared:SSL:1m;
    # ssl会话超时时间
    ssl_session_timeout 5m;
    # 配置加密套件,写法遵循 openssl 标准
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass xxx;
    }
}

MemCache

set $memcached_key "$uri";#设置memchache的key
memcached_pass mc_addr;#memcache的地址
error_page 404 /callback;#如果发生错误回调的地址

第三方模块的安装

#重新编译
./configure -prefix=path --add-moudle=moudlepath
make & make install
#会生成一个nginx.old的可执行文件

keepAlived

  1. 安装:下载后解压,执行./configure --prefix=/usr/local/keepalived --sysconf=/etc进行配置,完成之后执行make & make install即可。如果过程中出现警告,表示缺少依赖,可以通过yum安装对应依赖即可(yum -y install libnl libnl-devel)
  2. 启动:进入安装目录,执行sbin下的文件启动即可
  3. 配置:
global_defs {
   #通知邮件地址配置
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   # 路由id,当前安装keepalived节点主机的标识符,全局唯一
   router_id keep_1
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

# 这是一个计算机节点配置
vrrp_instance VI_1 {
    # 表示当前节点状态为主节点,或者设置为BACKUP表示备用机
    state MASTER
    # 当前实例绑定的网卡
    interface eth0
    # 虚拟路由id,保证主备节点一直
    virtual_router_id 51
    # 优先级,权重,按照优先级做为选举的依据,备用节点可以调低
    priority 100
    # 主备之间同步检查的间隔,默认为1s
    advert_int 1
    # 认证授权的密码,防止非法节点
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip配置,会将ip绑定到网卡,主机和备用机ip一致
    virtual_ipaddress {
        192.168.200.16
    }   
} 
  1. 与nginx配合:
  • nginx检测脚本:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi
  • keepalived配置:
# 在vrrp_instance下添加该配置
track_script {
    check_nginx_alive # 追踪 nginx 脚本
}

vrrp_script check_nginx_alive {
    script "/etc/keepalived/check_nginx_alive_or_not.sh"
    interval 2 # 每隔两秒运行上一行脚本 
    weight 10 # 如果脚本运行失败,则升级权重+10,或者设置为负数表示降低权重
}

keepalived双主热备

# 配置两个vrrp_instance,其中名称不一致,每个各绑定一个ip
vrrp_instance VI_1 {
    # 主机为MASTER,备用为BACKUP
    state MASTER
    interface ens33
    # 互为主备的值要一致
    virtual_router_id 51
    # 各自设置优先级
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 主节点配置可以添加该配置检测nginx
    track_script {
        check_nginx_alive # 追踪 nginx 脚本
    }
    virtual_ipaddress {
        192.168.1.115
    }
}

LVS

Linux Virtual Server

  • 工作模式
    1. NAT模式:请求响应均经过lvs
      网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机
    2. TUN模式:请求经过,响应直接返回给客户端
      请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端
    3. DR模式:请求经过,通过路由响应给客户端
      调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的
  • 安装配置
    1. 虚拟机配置需要关闭网络管理器
      systemctl stop NetworkManager``systemctl disable NetworkManager
    2. 复制并配置网卡配置
      /etc/sysconfig/network-scripts/ifcfg-xxx
    # 文件名:ifcfg-ens33:1
    BOOTPROTO=static
    DEVICE=ens33:1
    ONBOOT=yes
    IPADDR=192.168.0.150
    NETMASK=255.255.255.0
    
    1. 安装ipvsadm (云服务器一般虚拟ip服务需要付费使用)
      yum install ipvsadm
    2. 构建返回服务节点(其他服务器节点)
    # 文件名:ifcfg-lo:1
    # 使用命令 ifup lo
    DEVICE=lo:1
    IPADDR=192.168.0.150
    NETMASK=255.255.255.255
    NETWORK=127.0.0.0
    
    BROADCAST=127.255.255.255
    ONBOOT=yes
    NAME=loopback
    
    1. ARP配置 (响应节点配置)
     # 网卡行为介绍:
     # arp响应级别(处理请求) 
     #  0:只要配置了ip就能响应请求
     #  1:请求目标地址到达对应网络接口才会响应请求
     # arp-ignore: 1
     # arp通告行为(返回响应)- 通告即响应
     #  0: 本机上任何网络接口都能返回,所有网卡都能接收到请求
     #  1:尽可能避免本网卡与不匹配的目标进行响应
     #  2:只在本网卡响应
     # arp-announce: 2
    
     # 网卡行为配置:
     # 文件位置:/etc/sysctl.conf
     # configration for lvs
     net.ipv4.conf.all.arp_ignore = 1
     net.ipv4.conf.default.arp_ignore = 1
     net.ipv4.conf.lo.arp_ignore = 1
     net.ipv4.conf.all.arp_announce = 2
     net.ipv4.conf.default.arp_announce = 2
     net.ipv4.conf.lo.arp_announce = 2
     # 使用命令 sysctl -p 使配置生效
    
    1. 添加路由(重启失效,可以添加到开机启动脚本/etc/rc.local中) (响应节点配置)
      route add -host 192.168.0.150 dev lo:1
    2. 配置集群规则(lvs主节点配置)
     # -A 表示添加虚拟服务,-t表示tcp协议,-s表示负载均衡算法,rr表示轮询
     ipvsadm -A -t 192.168.0.150:80 -s rr
     # -Ln 表示查看配置
     ipvsadm -Ln
     # -a 表示构建服务节点,-t表示tcp协议,-r表示真实服务器地址,-g表示DR模式
     ipvsadm -a -t 192.168.0.150:80 -r 192.168.1.111:80 -g
     # -E表示修改配置,-p 表示持久化时间,即第一次请求定向到统一服务器的时间
     ipvsadm -E -t 192.168.0.150:80 -s rr -p 5
     # -Lns 表示查看配置路由定向情况和统一服务访问过期时间
     ipvsadm -Lns
     # 一般保持默认即可,不用配置,三个值表示 tcp tcpfin udp的连接超时时间
     ipvsadm --set 1 1 1
     # -C清空所有配置
     ipvsadm -C
    
    1. 当前配置的架构
     192.168.1.2 (lvs) -> 192.168.0.150:80
         -- 192.168.1.15:80 (real server)
         -- 192.168.1.16:80 (real server)
    

keepalived + lvs

# /etc/keepalived/keepalived.conf
# 主lvs的keepalived配置:
global_defs {
    router_id LVS_15
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 2
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.150
    }
}
# 配置集群地址访问的ip和端口,和nginx一致
virtual_server 192.168.0.150 80 {
    # 健康检查的时间,单位:s
    delay_loop 6
    # 负载均衡算法,默认轮询
    lb_algo rr
    # lvs模式 NAT|TUN|DR
    lb_kind DR
    # 会话请求持久化间隔时间:单位:s
    persistence_timeout 5
    # 协议设置
    protocol TCP

    # 真实服务器配置
    real_server 192.168.1.15 80 {
        # 轮训权重设置
        weight 1
        # 健康检查设置
        TCP_CHECK {
            # 检查的端口
            connect_port 80
            # 超时时间,单位:s
            connect_timeout 2
            # 重试次数
            nb_get_retry 2
            # 间隔时间,单位:s
            delay_before_retry 3
        }
    }
    real_server 192.168.1.16 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}
# 备份lvs的keepalived配置:
global_defs {
    router_id LVS_16
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 2
    # 官方建议相差50
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.150
    }
}
# 配置集群地址访问的ip和端口,和nginx一致
virtual_server 192.168.0.150 80 {
    # 健康检查的时间,单位:s
    delay_loop 6
    # 负载均衡算法,默认轮询
    lb_algo rr
    # lvs模式 NAT|TUN|DR
    lb_kind DR
    # 会话请求持久化间隔时间:单位:s
    persistence_timeout 5
    # 协议设置
    protocol TCP

    # 真实服务器配置
    real_server 192.168.1.15 80 {
        # 轮训权重设置
        weight 1
        # 健康检查设置
        TCP_CHECK {
            # 检查的端口
            connect_port 80
            # 超时时间,单位:s
            connect_timeout 2
            # 重试次数
            nb_get_retry 2
            # 间隔时间,单位:s
            delay_before_retry 3
        }
    }
    real_server 192.168.1.16 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}

高性能服务器架构

#优化思路
1.减少请求(合并css,js等,合并图片,添加缓存,减少查库,添加cdn)
2.添加服务器(服务器集群加负载均衡)
nginx统计模块使用 --with-http_stub_status_module 参数重新编译
location /status {
    stub_status on;#开启统计模块
    access_log off;#关闭日志
    allow 127.0.0.1;#只允许指定ip访问
    deny all;#禁止其他访问
}
#解决方案
worker_connections  #修改工作进程最大链接数
worker_rlimit_nofile #修改nginx进程允许打开的文件数,全局配置

/proc/sys/net/core/somaxconn  #加大进程最大连接数 
/proc/sys/net/ipv4/tcp_tw_recycle #tcp快速回收 1开启
/proc/sys/net/ipv4/tcp_tw_reuse #tcp重用 1开启
/proc/sys/net/ipv4/tcp_syncookies #tcp洪水抵御 0关闭
ulimit -n 10000 #加大系统允许打开的文件数
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容