32-高性能WEB服务NGINX(二)

选择SSL证书品牌(CA供应商)

  • 阿里云SSL证书申请:
    https://www.aliyun.com/product/cas?spm=a2c4g.11174283.2.1.47676fd4baNCYX
  • 支持阿里云颁发数字证书的安全CA中心包括:
    ● Symantec:赛门铁克(Symantec)是全球第一大数字证书颁发机构、全球最值得信赖的SSL证书品牌,所有证书都采用业界领先的加密技术,为不同的网站和服务器提供安全解决方案
    ● CFCA: 中国金融认证中心(CFCA)通过国际WebTrust认证,遵循全球统一鉴证标准,是国际CA浏览器联盟组织成员。 CFCA全球信任SSL证书,由中国权威数字证书认证机构自主研发,纯国产证书。 CFCA提供 7x24 小时金融级的安全保障服务,且有完善的风险承保计划。提供中文版全球信任体系电子认证业务规则(CPS),便于用户理解双方权利和义务
    ● GeoTrust: GeoTrust 是全球第二大数字证书颁发机构, 也是身份认证和信任认证领域的领导者,采用各种先进的技术使任何大小的机构和公司都能安全、低成本地部署SSL数字证书和实现各种身份认证
    ● GlobalSign: GMO GlobalSign是全球最早的数字证书认证机构之一,一直致力于网络安全认证及数字证书服务,是一个备受信赖的CA和SSL数字证书提供商

选择证书类型

  • 阿里云联合有资质的CA中心推荐以下几种数字证书配置组合方案:

  • 免费型DV SSL: 免费型DV SSL证书是基础级SSL产品
    ● 说明 目前仅Symantec提供免费型数字证书,该证书仅支持绑定一个域名
    ● 只验证域名所有权,数小时内即可颁发
    ● 只提供通信链路加密功能
    ● 根证书一般使用CA中心认证的根证书
    ● 支持绑定一个明细子域名,且不支持通配符域名

  • 通配符DV SSL:通配符DV SSL证书属于DV型SSL证书(Domain Validation SSL)
    ● 只验证域名所有权,数小时内即可颁发
    ● 提供高强度通信链路加密功能
    ● 支持绑定一个带有通配符的域名

  • 专业版OV SSL: 专业版OV SSL证书属于OV型SSL证书(Organization Validation SSL)
    ● 验证域名所有权和申请单位的真实身份,解决在线信任问题
    ● 证书中显示申请者的企业单位名称,让访问用户安心使用
    ● 提供高强度通信链路加密功能
    ● 支持最多绑定100个域名,支持绑定通配符域名
    ● 说明 除专业版OV SSL证书外,Symantec还提供增强型OV SSL证书。增强型OV SSL证书采用ECC椭圆曲线算法

  • 高级版EV SSL:高级版EV SSL证书属于EV型SSL证书(Extended Validation SSL)
    ● 严格验证域名所有权和申请单位的真实身份
    ● 证书在大部分浏览器中能显示绿色地址栏(部分证书在Safari浏览器中不显示),有效解决在线信任和网站被假冒问题
    ● 证书中详细显示申请者的企业单位信息,让访问用户安心使用
    ● 提供高强度通信链路加密功能。
    ● 支持最多绑定100个域名
    ● 说明 除高级版EV SSL证书外,Symantec还提供增强型EV SSL证书。增强型EV SSL证书采用ECC椭圆曲线算法

ngx_http_ssl_module

  • ssl on | off;
    为指定虚拟机启用HTTPS protocol, 建议用listen指令代替

  • ssl_certificate file;
    当前虚拟主机使用PEM格式的证书文件

  • ssl_certificate_key file;
    当前虚拟主机上与其证书匹配的私钥文件

  • ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 支持ssl协议版本,默认为后三个

  • ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
    none: 通知客户端支持ssl session cache,但实际不支持
    builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
    [shared:name:size]:在各worker之间使用一个共享的缓存

  • ssl_session_timeout time;
    客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

示例:

server {
    listen 443 ssl;
    server_name www.magedu.com;
    root /vhosts/ssl/htdocs;
    ssl on;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
}  

小笔记:nginx ssl

#生成cA证书
cd /etc/pki/tls/certs
make magedu.crt
password            #默认得输密码
CN
beijing
beijing
magedu.net
opt
www.magedu.net

openssl rsa -in magedu.key -out magedu.net.key      #解密私钥
mv magedu.crt magedu.net.crt
chomod 600 magedu.net.key
mv magedu.net.crt magedu.net.key /etc/nginx/ssl

vim /etc/nginx/conf.d/test.conf
server {
    server_name www.magedu.net;
    root /data/test;
    location / {}
    access_log /var/log/nginx/magedu_net.access.log access_json;
    gzip on;                #启用压缩
    gzip_comp_level 6;      #压缩等级
    gzip_min_length 64;     #响应报文阈值
    gzip_vary on;           #响应报文首部插入“Vary: Accept-Encoding”  
    gzip_types text/xml text/css application/javascript;    #压缩类型
}
server {
    listen 443 ssl;
    server_name www.magedu.net;
    root /data/test;
    ssl_certificate /etc/nginx/ssl/magedu.net.crt;
    ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
}

vim /etc/nginx/conf.d/test.conf             #一个虚拟主机
server {
    listen 80;
    listen 443 ssl;
    server_name www.magedu.net;
    root /data/test;
    ssl_certificate /etc/nginx/ssl/magedu.net.crt;
    ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
}

ngx_http_rewrite_module

  • ngx_http_rewrite_module模块:
    将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换
    示例:
    http://www.magedu.com/hn --> http://www.magedu.com/henan
    http://www.magedu.com --> https://www.magedu.com/

  • if (condition) { ... }
    条件满足时,执行配置块中的配置指令;server, location
    condition:

    比较操作符:
      = 相同 != 不同
      ~ 模式匹配,区分字符大小写
      ~* 模式匹配,不区分字符大小写
      !~ 模式不匹配,区分字符大小写
      !~* 模式不匹配,不区分字符大小写
    文件及目录存在性判断:
      -e,!-e 存在与否(包括文件,目录,软链接)
      -f,!-f 文件 -d,!-d 目录 -x,!-x 执行
    
  • 注意: if (condition) { ... } 语句中,如果$变量的值为空字符串或是以0开头的任意字符串,则 if 指令认为该条件为false,其它条件为true
    示例:

    location /test {
      index index.html;
      default_type text/html;
      if ( $scheme = http ){
          return 301 https://www.magedu.net/;
      }
      if ( $scheme = https ){
          echo "if ----> $scheme";
      } 
      if (-f $request_filename) {
          echo "file is exist";
      }
      if (!-f $request_filename) {
          echo "file is not exist";
          return 409;
      }
    } 
    
  • return
    return code [text]; #返回客户端指定的状态码和文本说明
    return code URL;
    return URL;
    停止处理,并返回给客户端指定的响应码(包括: 204, 400, 402 — 406, 408,410, 411, 413, 416, 500 — 504),并对 301, 302, 303, 307, 308跳转到URL

  • rewrite_log on | off;
    是否开启重写日志, 发送至error_log(notice level)

  • set variable value; 用户自定义变量 注意:变量定义和调用都要以开头

    示例:

    location /test {
      root /data/nginx/html/pc;
      default_type text/html;
      index index.html;
      if ( $scheme = http ){
          #return 666;
          #return 666 "not allow http";
          #return 301 http://www.baidu.com;
          return 500 "service error";
          echo "if-----> $scheme"; #return后面的将不再执行
      }
      if ( $scheme = https ){
          echo "if ----> $scheme";
      }
    } 
    
  • rewrite regex replacement [flag]
    ● 将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
    ● 注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
    ● 隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
    ● 如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301

  • [flag]:
    ● last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环
    ● break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块后的其它配置;结束循环
    ● redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;可使用相对路径,或http://或https://开头,此重定向信息不可缓存,状态码:302
    ● permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,此重定向信息可缓存,状态码:301

    location /break {
    rewrite ^/break/(.*) /test/$1 break; #break不会跳转到其他的location
      return 666 "break";
    }
    location /last {
      rewrite ^/last/(.*) /test/$1 last; #last会跳转到其他的location继续匹配新的URI
      return 888 "last";
    }
    location /test {
      return 999 "test";
      index index.html;
      root /data/nginx;
    }
    mkdir /data/nginx/test/
    echo test Page > /data/nginx/test/index.html
    
    #rewrite 生产案例
    #要求:将 http:// 请求跳转到 https://
    #生产案例
    location / {
      if ($scheme = http ) {
          rewrite / https://www.magedu.net/ redirect;
      }
    }
    
    #要求:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页
    #生产案例
    location / {
      root /data/nginx/html/pc;
      index index.html;
      if (!-f $request_filename) {
          #return 404 "No exsit";
          rewrite (.*) http://www.magedu.net/index.html;
      }
    }
    

    小笔记:http_rewrite模块

    #重定向
    vim /etc/nginx/conf.d/test.conf
    server {
      listen 80;
      listen 443 ssl;
      server_name www.magedu.net;
      root /data/test;
      ssl_certificate /etc/nginx/ssl/magedu.net.crt;
      ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
      ssl_session_cache shared:sslcache:20m;
      ssl_session_timeout 10m;
      access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
      location / {
          if ( $scheme = http ){
              return 301 https://www.magedu.net/;
          }
      }
    }
    
    #禁止某浏览器访问
    vim /etc/nginx/conf.d/test.conf
    server {
      listen 80;
      listen 443 ssl;
      server_name www.magedu.net;
      root /data/test;
      ssl_certificate /etc/nginx/ssl/magedu.net.crt;
      ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
      ssl_session_cache shared:sslcache:20m;
      ssl_session_timeout 10m;
      access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
      location / {
          if ( $scheme = http ){
              return 301 https://www.magedu.net/;
          }
          if ( $http_user_agent ~* curl ){        #判断浏览器类型
              return 403;
          }
      }
    }
    
    #rewrite
    vim /etc/nginx/conf.d/test.conf
    server {
      location /test1 {
          rewrite ^/test1/(.*)$ /test2/$1 last;   #last|break|redirect|permanent
      }
      location /test2 {
          default_type text/html;
          echo test2;
      }
    }
    
    vim /etc/nginx/conf.d/test.conf
    server {
      listen 80;
      listen 443 ssl;
      server_name www.magedu.net;
      root /data/test;
      ssl_certificate /etc/nginx/ssl/magedu.net.crt;
      ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
      ssl_session_cache shared:sslcache:20m;
      ssl_session_timeout 10m;
      access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
      location / {
          if ( $scheme = http ){
              rewrite ^/(.*)$ https://www.magedu.net/$1 redirect;     #重定向https
          }
      }
    }
    
    #双https
    cd /etc/pki/tls/certs
    vim Makefile
    %.key:
      umask 77; \
      #/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
      /usr/bin/openssl genrsa $(KEYLEN) > $@                          #把加密去掉
    make magedu.org.crt
    CN
    beijing
    beijing
    magedu.org
    opt
    www.magedu.org
    mv magedu.or.* /etc/nginx/ssl
    mkdir /data/site{1,2}
    echo /data/site1/index.html > /data/site1/index.html
    echo /data/site2/index.html > /data/site2/index.html
    
    vim /etc/nginx/conf.d/test.conf
    server {
      listen 80;
      listen 443 ssl;
      server_name www.magedu.net;
      root /data/site1;
      ssl_certificate /etc/nginx/ssl/magedu.net.crt;
      ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
      ssl_session_cache shared:sslcache:20m;
      ssl_session_timeout 10m;
      access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
      location / {
          if ( $scheme = http ){
              rewrite ^/(.*)$ https://www.magedu.net/$1 redirect;     #重定向https
          }
          if ( !-f $request_filename ) {
              rewrite ^/(.*)$ http://www.magedu.net/index.html;       #错误页面重定向到主页
          }
      }
    }
    server {
      listen 80;
      listen 443 ssl;
      server_name www.magedu.org;
      root /data/site2;
      ssl_certificate /etc/nginx/ssl/magedu.org.crt;
      ssl_certificate_key /etc/nginx/ssl/magedu.org.key;
      ssl_session_cache shared:sslcache:20m;
      ssl_session_timeout 10m;
      access_log /var/log/nginx/magedu_org.ssl.access.log access_json;
      location / {
          if ( $scheme = http ){
              rewrite ^/(.*)$ https://www.magedu.org/$1 redirect;     #重定向https
          }
            if ( !-f $request_filename ) {
              rewrite ^/(.*)$ http://www.magedu.org/index.html;       #错误页面重定向到主页
          }
      }
    }
    

ngx_http_referer_module

  • ngx_http_referer_module模块:
    用来阻止Referer首部无有效值的请求访问,可防止盗链
  • valid_referers none|blocked|server_names|string ...;
    定义referer首部的合法可用值,不能匹配的将是非法值
    none:请求报文首部没有referer首部
    blocked:请求报文有referer首部,但无有效值
    server_names:referer首部中包含本主机名
    arbitrary_string:任意字符串,但可使用作通配符
    regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,
    例如: ~.
    .magedu.com
防止盗链生产案例:
valid_referers none block server_names
*.magedu.com magedu.* *.mageedu.com mageedu.* ~\.magedu\.
~\.google\. ~\.baidu\.;
if ($invalid_referer) {
    return 403 "Forbidden Access";
}  

小笔记:防盗链

cp sunflower.jpg /data/site2/sun.jpg
vim /data/site1/daolian.html
<img src=http://www.magedu.org/sun.jpg>

vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    listen 443 ssl;
    server_name www.magedu.net;
    root /data/site1;
    ssl_certificate /etc/nginx/ssl/magedu.net.crt;
    ssl_certificate_key /etc/nginx/ssl/magedu.net.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location / {
        if ( !-f $request_filename ) {
            rewrite ^/(.*)$ http://www.magedu.net/index.html;       #错误页面重定向到主页
        }
    }
}
server {
    listen 80;
    listen 443 ssl;
    server_name www.magedu.org;
    root /data/site2;
    ssl_certificate /etc/nginx/ssl/magedu.org.crt;
    ssl_certificate_key /etc/nginx/ssl/magedu.org.key;
    ssl_session_cache shared:sslcache:20m;
    ssl_session_timeout 10m;
    access_log /var/log/nginx/magedu_org.ssl.access.log access_json;
    location / {
        if ( !-f $request_filename ) {
            rewrite ^/(.*)$ http://www.magedu.org/index.html;       #错误页面重定向到主页
        }
    }
    valid_referers none block server_names *.magedu.com magedu.* *.mageedu.com mageedu.* ~\.magedu\. ~\.google\. ~\.baidu\.;    #除了定义的域名,其他不允许链接,防盗链
    if ($invalid_referer) {
        return 403 "Forbidden Access";
    }  
}

nginx反向代理

image.png
  • 反向代理:reverse proxy,可代理外网用户的请求到内部的指定web服务器,并将数据返回给用户
  • nginx除了可以在企业提供高性能的web服务之外,另外还可以将本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是nginx服务器与其他服务器进行通信的一种规范
  • 主要在不同的场景使用以下模块实现不同的功能:
    ngx_http_proxy_module: 将客户端请求以http协议转发至后端服务器
    ngx_http_fastcgi_module:将客户端对php请求以fastcgi协议转发至后端
    ngx_http_uwsgi_module:将客户端对Python请求以uwsgi协议转发至后端
    ngx_stream_proxy_module:将客户端请求以tcp协议转发至后端服务器

ngx_http_proxy_module

  • ngx_http_proxy_module模块:
    转发请求至另一台主机
    proxy_pass URL;
    注意:proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机

    server {
      ...
      server_name HOSTNAME;
      location /uri/ {
          proxy_pass http://host[:port]; 注意:最后没有/
      }
      ...
    }
    

    上面示例:http://HOSTNAME/uri --> http://host/uri ,功能类似 root
    如果上面示例中有 /,即:http://host[:port]/ 此方式较少使用
    意味着:http://HOSTNAME/uri --> http://host/ 即置换,功能类似 alias

  • proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的

    uri
    server {
      ...
      server_name HOSTNAME;
      location /uri/ {
          proxy_pass http://host/new_uri/;
      }
      ...
    }
    http://HOSTNAME/uri/ --> http://host/new_uri/  
    
  • 如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri; 用户请求时传递的uri将直接附加至后端服务器之后

    server {
      ...
      server_name HOSTNAME;
      location ~|~* /uri/ {
          proxy_pass http://host; 不能加/
      }
      ...
    }
    http://HOSTNAME/uri/ --> http://host/uri/
    
  • proxy_set_header field value;
    设定转发往后端主机的请求报文的请求首部的值;
    Context: http, server, location
    proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-Forproxy_add_x_forwarded_for;

    • 请求报文的标准格式如下:
      X-Forwarded-For: client1, proxy1, proxy2
  • proxy_cache_path;

    ● 定义可用于proxy功能的缓存;Context:http
    ● proxy_cache_path path [levels=levels] [use_temp_path=on|off]
    keys_zone=name:size [inactive=time] [max_size=size]
    [manager_files=number] [manager_sleep=time] [manager_threshold=time]
    [loader_files=number] [loader_sleep=time] [loader_threshold=time]
    [purger=on|off] [purger_files=number] [purger_sleep=time]
    [purger_threshold=time];
    示例:在http配置定义缓存信息

    proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创建
    levels=1:2:2 #定义缓存目录结构层次,1:2:2 可以生成2^4x2^8x2^8=1048576个目录
    keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)
    inactive=120s; #缓存有效时间
    max_size=1g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
    

    ● proxy_cache zone | off; 默认off
    指明调用的缓存,或关闭缓存机制;Context:http, server, location
    ● proxy_cache_key string;
    缓存中用于“键”的内容
    默认值:proxy_cache_key schemeproxy_host$request_uri;
    ● proxy_cache_valid [code ...] time;
    定义对特定响应码的响应内容的缓存时长
    定义在http{...}中
    示例:
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;

    • 示例:在http配置定义缓存信息
    proxy_cache_path /var/cache/nginx/proxy_cache
    levels=1:2:2 keys_zone=proxycache:20m
    inactive=120s max_size=1g;
    #说明:proxycache:20m 指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)
    max_size=1g #指磁盘存入文件内容的缓存空间最大值
    #调用缓存功能,需要定义在相应的配置段,如server{...};
    proxy_cache proxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    
  • proxy_cache_use_stale;
    proxy_cache_use_stale error | timeout | invalid_header | updating |
    http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...
    在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

  • proxy_cache_methods GET | HEAD | POST ...;
    对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

  • proxy_hide_header field;
    用于隐藏后端服务器特定的响应首部,默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等
    示例:
    proxy_hide_header Etag;

  • proxy_pass_header field;
    默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端

小笔记:http_proxy_module模块

#调度(rs访问日志看不到真正的访问ip地址)
vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location ~* ^.*\.(jpg|gif|bmp|jpeg)$ {
        proxy_pass http://192.168.37.37;
    }
    location /api {
        proxy_pass http://192.168.37.47;
    }
}

#37
yum install httpd -y
echo 37 > /var/www/html/index.html
cp sky.jpg /var/www/html/
systemctl start httpd

#47
yum install httpd -y
mkdir /var/www/html/api
echo api > /var/www/html/api/index.html
systemctl start httpd

#----------------分割线--------------------#

#调度(rs访问日志看到真正的访问ip地址)
vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location ~* ^.*\.(jpg|gif|bmp|jpeg)$ {
        proxy_pass http://192.168.37.37;
    }
    location /api {
        #proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.37.47;
    }
}

#rs修改日志格式
vim /etc/httpd/conf/httpd.conf
LogFormat "\"%{X-Forwarded-For}i\" %h ..." nginxlog

#----------------分割线--------------------#

#启用缓存
vim /etc/nginx/nginx.conf
http {
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g;  
    ...
}
vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    #调用缓存
    proxy_cache proxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    proxy_hide_header Etag;             #隐藏ETAG
    #proxy_pass_header Server;              #后端软件版本号替换为前端版本号
    location ~* ^.*\.(jpg|gif|bmp|jpeg)$ {
        proxy_pass http://192.168.37.37;
    }
    location /api {
        #proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.37.47;
    }
}
mkdir /var/cache/nginx/

ngx_http_headers_module

  • ngx_http_headers_module模块
    向代理服务器给客户端的响应报文添加自定义首部,或修改指定首部的值
  • add_header name value [always];
    添加自定义首部
    add_header X-Via server_addr; add_header X-Cacheupstream_cache_status;
    add_header X-Accel $server_name;
  • add_trailer name value [always];
    添加自定义响应信息的尾部, 1.13.2版后支持
  • proxy_connect_timeout time;
    定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为60s,
    一般不建议超出75s
  • proxy_send_timeout time;
    对后端服务器send,将请求发送给后端服务器的超时时长;默认为60s
  • proxy_read_timeout time;
    从后端服务器read,等待后端服务器发送响应报文的超时时长,默认为60s
  • proxy_ignore_client_abort off;
    当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后nginx也会中断客户端请求并立即记录499日志,默认为off
  • proxy_http_version 1.0;
    用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0
  • proxy_headers_hash_bucket_size 128;
    当配置了 proxy_hide_header和proxy_set_header的时候,用于设置nginx保
    存HTTP报文头的hash表的上限
  • proxy_headers_hash_max_size 512;
    设置proxy_headers_hash_bucket_size的最大可用空间
  • server_namse_hash_bucket_size 512;
    server_name hash表申请空间大小
  • server_names_hash_max_size 512;
    设置服务器名称hash表的上限大小

小笔记:http_headers_module

vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    #调用缓存
    proxy_cache proxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    proxy_hide_header Etag                  #隐藏ETAG
    proxy_pass_header Server                #后端软件版本号替换为前端版本号
    add_header X-Cache $upstream_cache_status;  #添加响应字段
    location ~* ^.*\.(jpg|gif|bmp|jpeg)$ {
        proxy_pass http://192.168.37.37;
    }
    location /api {
        #proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.37.47;
    }
}

ngx_http_fastcgi_module

  • ngx_http_fastcgi_module模块
    转发请求到FastCGI服务器,不支持php模块方式

  • fastcgi_pass address;
    address为后端的fastcgi server的地址
    可用位置:location, if in location

  • fastcgi_index name;
    fastcgi默认的主页资源
    示例:fastcgi_index index.php;

  • fastcgi_param parameter value [if_not_empty];
    设置传递给 FastCGI 服务器的参数值,可以是文本,变量或组合

  • 示例1:
    1)在后端服务器先配置fpm server和mariadb-server
    2)在前端nginx服务上做以下配置:

    location ~* \.php$ {
      root /data/php; #$document_root 调用root目录
      fastcgi_pass 后端fpm服务器IP:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      #fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
      #如果SCRIPT_FILENAME是绝对路径,则可以省略root /data/php;
      include fastcgi_params;
    }
    
  • 示例2:通过/pm_status和/ping来获取fpm server状态信息

    location ~* ^/(fpm_status|ping)$ {
      fastcgi_pass 后端fpm服务器IP:9000;
      fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
      include fastcgi_params;
    }
    
    cat /etc/php-fpm.d/www.conf
    [www]
    listen = 127.0.0.1:9000 #监听地址及IP
    listen.allowed_clients = 127.0.0.1 #允许客户端从哪个源IP地址访问,要允许所有行首加 ;注释即可
    user = nginx #php-fpm启动的用户和组,会涉及到后期文件的权限问题
    group = nginx
    pm = dynamic #动态模式进程管理
    pm.max_children = 500 #静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进程数
    pm.start_servers = 100 #动态模式下初始进程数,必须大于等于pm.min_spare_servers和小于等于pm.max_children的值。
    pm.min_spare_servers = 100 #最小空闲进程数
    pm.max_spare_servers = 200 #最大空闲进程数
    pm.max_requests = 500000 #进程累计请求回收值,会重启
    pm.status_path = /pm_status #状态访问URL
    ping.path = /ping #ping访问动地址
    ping.response = ping-pong #ping返回值
    slowlog = /var/log/php-fpm/www-slow.log #慢日志路径
    php_admin_value[error_log] = /var/log/php-fpm/www-error.log #错误日志
    php_admin_flag[log_errors] = on
    php_value[session.save_handler] = files #phpsession保存方式及路径
    php_value[session.save_path] = /var/lib/php/session #当时使用file保存session的文件路径
    
  • fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
    [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time]
    [manager_threshold=time] [loader_files=number] [loader_sleep=time]
    [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
    [purger_threshold=time];

  • 定义fastcgi的缓存;
    path 缓存位置为磁盘上的文件系统路径
    max_size=size
    磁盘path路径中用于缓存数据的缓存空间上限
    levels=levels:缓存目录的层级数量,以及每一级的目录数量,levels=ONE:TWO:THREE
    示例:leves=1:2:2
    keys_zone=name:size
    k/v映射的内存空间的名称及大小
    inactive=time
    非活动时长

  • fastcgi_cache zone | off;
    调用指定的缓存空间来缓存数据,可用位置:http, server, location

  • fastcgi_cache_key string;
    定义用作缓存项的key的字符串
    示例:fastcgi_cache_key $request_uri;

  • fastcgi_cache_methods GET | HEAD | POST ...;
    为哪些请求方法使用缓存

  • fastcgi_cache_min_uses number;
    缓存项在inactive定义的非活动时间内至少要被访问到指定的次数方可被认作活动项

  • fastcgi_keep_conn on | off;
    收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接

  • fastcgi_cache_valid [code ...] time;
    不同的响应码各自的缓存时长

    示例:

    http {
      fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
      ...
      server {
          location ~* \.php$ {
              ...
              fastcgi_cache fcgicache;
              fastcgi_cache_key $request_uri;
              fastcgi_cache_valid 200 302 10m;
              fastcgi_cache_valid 301 1h;
              fastcgi_cache_valid any 1m;
              ...
          }
      }
    }    
    

小笔记:搭建fastcgi

#server
yum install php-fpm php-mysql
vim /etc/php-fpm.d/www.conf
    user = nginx
    group = nginx
    pm.status_path = /fpm_status
    ping.path = /ping
systemctl start php-fpm
mkdir /data/php/

vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
        index index.php;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location ~* \.php$ {
        root /data/php;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~* ^/(fpm_status|ping)$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
    }
}
tar xf wordpress-5.1.1-zh_CN.tar.gz -C /data/php
cd /data/php/wordpress
cp -a wp-config-sample.php  wp-config.php
vim wp-config.php
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wordpress' );
define( 'DB_PASSWORD', 'centos' );
define( 'DB_HOST', '192.168.37.27' );
cp -a * /data/site1
mkdir /data/php/wp-content/uploads
setfacl -R -m u:nginx:rwx /data/php
setfacl -R -m u:nginx:rwx /data/site1
systemctl restart nginx php-fpm

#mysql-server
yum install mariadb
systemctl start mariadb
mysql -e 'create database wordpress;grant all on wordpress.* to wordpress@"192.168.37.%" identified by "centos"'
mysql -e 'flush privileges;'

#client
http://www.magedu.net/wordpress
http://www.magedu.net/fpm_status
http://www.magedu.net/fpm_status?full
http://www.magedu.net/fpm_status?xml
http://www.magedu.net/fpm_status?json

小笔记:安装新版本php

#server
yum install https://mirror.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
vim /etc/yum.repos.d/remi-php73.repo
[remi-php73]
enabled=1
yum install php73-php-fpm php73-php-mysql
groupadd -g 981 nginx
useradd -u -r 987 -g nginx -s /sbin/nologin nginx
vim /etc/php73-php-fpm.d/www.conf
    user = nginx
    group = nginx
    listen = 9000
    ;listen.allowed_clients = 127.0.0.1     #注释掉
    pm.status_path = /fpm_status
    ping.path = /ping
    
vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/php;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~* ^/(fpm_status|ping)$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
    }
}
tar xf wordpress-5.1.1-zh_CN.tar.gz -C /data/php
cd /data/php/wordpress
cp -a wp-config-sample.php  wp-config.php
vim wp-config.php
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wordpress' );
define( 'DB_PASSWORD', 'centos' );
define( 'DB_HOST', '192.168.37.27' );
systemctl restart php73-php-fpm nginx

小笔记:nginx开启php-fpm缓存

#server
vim /etc/nginx/nginx.conf
http {
    fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
    ...
}
vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~* ^/(fpm_status|ping)$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
    }
    #开启fastcgi缓存
    fastcgi_cache fcgicache;
    fastcgi_cache_key $request_uri;
    fastcgi_cache_valid 200 302 10m;
    fastcgi_cache_valid 301 1h;
    fastcgi_cache_valid any 1m;
}

ngx_http_upstream_module (高可用调度)

  • ngx_http_upstream_module模块
    将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用

  • upstream name { ... }
    定义后端服务器组,会引入一个新的上下文
    默认调度算法是wrr

    Context: http
    upstream httpdsrvs {
      server ...
      server...
      ...
    } 
    
  • server address [parameters];
    在upstream上下文中server成员,以及相关的参数;Context:upstream

    address的表示格式:
      unix:/PATH/TO/SOME_SOCK_FILE
      IP[:PORT]
      HOSTNAME[:PORT]
    parameters:
      weight=number 权重,默认为1
      max_conns 连接后端报务器最大并发活动连接数,1.11.5后支持
      max_fails=number 失败尝试最大次数;超出此处指定的次数时,server将被标
      记为不可用,默认为1
      fail_timeout=time 后端服务器标记为不可用状态的连接超时时长,默认10s
      backup 将服务器标记为“备用”,即所有服务器均不可用时才启用
      down 标记为“不可用”,实现灰度发布
    
  • nginx调度算法:

    • ip_hash 源地址hash调度方法

    • least_conn 最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接

    • hash key [consistent] 基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合
      作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用
      hash request_uri consistent; #目标地址hash,相当于lvs的DH调度算法 hashremote_addr; #跟ip_hash一样
      hash $cookie_name; #key为name的cookie

    • keepalive 连接数N;
      为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗

小笔记:nginx高可用调度

#server
vim /etc/nginx/nginx.conf
http {
    upstream websrvs {              #默认调度wrr
        server 192.168.37.37:80;
        server 192.168.37.47:80;
        server 192.168.37.37:80 weight=3;   #权重
        server 192.168.37.47:80;
        #server 192.168.37.47:80 down;      #下线
        server 127.0.0.1:8080 backup;
    }
}
vim /etc/nginx/conf.d/test.conf
server {
    listen 80;
    server_name www.magedu.net;
    root /data/site1;
    index index.html
    access_log /var/log/nginx/magedu_net.ssl.access.log access_json;
    location / {
        proxy_pass http://websrvs;          #多组服务器方向代理
    }
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
        include fastcgi_params;
    }
    #开启fastcgi缓存
    fastcgi_cache fcgicache;
    fastcgi_cache_key $request_uri;
    fastcgi_cache_valid 200 302 10m;
    fastcgi_cache_valid 301 1h;
    fastcgi_cache_valid any 1m;
}
server {
    listen 8080;
    root /data/site2;
    index index.html
    access_log /var/log/nginx/magedu_net.sorry.access.log access_json;
}

#rs
systemctl stop httpd

#----------------分割线---------------------#

#调度算法
vim /etc/nginx/nginx.conf
http {
    upstream websrvs {              #默认调度wrr
        server 192.168.37.37:80;
        server 192.168.37.47:80;
        server 192.168.37.37:80 weight=3;   #权重
        server 192.168.37.47:80;
        #server 192.168.37.47:80 down;      #下线
        server 127.0.0.1:8080;
        hash $cookie_sessionid;             #调度算法
    }
    location /echo {
        default_type text/html;
        echo hello;
        echo $cookie_sessionid;
    }
}

vim setcookie.php
<?php
setcookie('title','cto');
setcookie('sessionid','123456');
setcookie('user','wang',time()+3600*12);
?>

#说明:此调度方法缺点:down机后会使后端服务器压力过大

#client
curl -b sessionid=123456 192.168.37.7/echo      #指定cookie

一致性hash算法

解决了上面调度算法的缺点

http {
    hash $cookie_sessionid consistent;
}

ngx_stream_core_module

  • ngx_stream_core_module模块
    模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器

  • stream { ... }
    定义stream相关的服务;Context:main

    stream {
      upstream mysqlsrvs {
          server 192.168.8.2:3306;
          server 192.168.8.3:3306;
          least_conn;
      }
      server {
          listen 10.1.0.6:3306;
          proxy_pass mysqlsrvs;
      }
    }  
    
  • listen

    listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind]
      [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; 
    

ngx_stream_proxy_module

  • ngx_stream_proxy_module模块
    可实现代理基于TCP,UDP (1.9.13), UNIX-domain sockets的数据流

  • proxy_pass address;
    指定后端服务器地址

  • proxy_timeout timeout;
    无数据传输时,保持连接状态的超时时长
    默认为10m

  • proxy_connect_timeout time;
    设置nginx与被代理的服务器尝试建立连接的超时时长
    默认为60s

TCP反向代理生产案例

stream {
    upstream mysql_servers {
        server 192.168.0.10:3306;
        server 192.168.0.11:3306;
        hash $remote_addr consistent;
    }
    server {
        listen 172.16.100.100:3306;
        proxy_pass mysql_servers;
        proxy_timeout 60s;
        proxy_connect_timeout 10s;
    }
}

stream {
    upstream redis_servers {
        server 192.168.0.10:6379 max_fails=3 fail_timeout=30s;
    }
    server {
        listen 172.16.100.100:6379;
        proxy_pass redis_servers;
        proxy_timeout 60s;
        proxy_connect_timeout 10s;
    }
}

小笔记:基于传输层(tcp/udp)的反向代理调度

#mysql-server1
yum install mariadb -y
systemctl start mariadb
mysql -e "create database db37;grant all on *.* to test@'192.168.37.%' identified by 'centos';flush privileges"

#mysql -server2
yum install mariadb -y
systemctl start mariadb
mysql -e "create database db47;grant all on *.* to test@'192.168.37.%' identified by 'centos';flush privileges"

#nginx-server
vim /etc/nginx/nginx.conf
stream {
    upstream mysqlsrvs {
        server 192.168.37.37:3306;
        server 192.168.37.47:3306;
        least_conn;
    }
    server {
        listen 192.168.37.7:3306;
        proxy_pass mysqlsrvs;
    }
}

#client
mysql -utest -pcentos -h192.168.37.7 -e "show databases"

Tengine

  • Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。 Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
  • 官网:
    http://tengine.taobao.org
  • 官方文档:
    http://tengine.taobao.org/documentation_cn.html

Tengine特性

  • 继承Nginx-1.16.0的所有特性,兼容nginx的配置
  • 支持HTTP的CONNECT方法,可用于正向代理场景
  • 支持异步OpenSSL,可使用硬件如:QAT进行HTTPS的加速与卸载
  • 增强相关运维、监控能力,比如异步打印日志及回滚,本地DNS缓存,内存监控等
  • Stream模块支持server_name指令
  • 更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名
  • 输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便
  • 支持设置proxy、 memcached、 fastcgi、 scgi、 uwsgi在后端失败时的重试次数
  • 动态脚本语言Lua支持。扩展功能非常高效简单
  • 支持按指定关键字(域名,url等)收集Tengine运行状态
  • 组合多个CSS、 JavaScript文件的访问请求变成一个请求
  • 自动去除空白字符和注释从而减小页面的体积
  • 自动根据CPU数目设置进程个数和绑定CPU亲缘性;
  • 监控系统的负载和资源占用从而对系统进行保护
  • 显示对运维人员更友好的出错信息,便于定位出错机器
  • 更强大的防攻击(访问速度限制)模块
  • 更方便的命令行参数,如列出编译的模块列表、支持的指令等
  • 可以根据访问文件类型设置过期时间

小笔记:源码编译tengine

yum install gcc pcre-devel openssl-devel zlib-devel
wget http://tengine.taobao.org/download/tengine-2.1.2.tar.gz        #此版本不支持传输层反向代理
tar -xf tengine-2.1.2.tar.gz
useradd -r -s /sbin/nologin nginx
cd tengine-2.1.2
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-http_concat_module       #tengine特有模块,合并多个请求,一次性返回,提高访问速度
make && make install

cd /apps/nginx/
vim conf/nginx.conf
    server {
        ...
        location / {
            ...
            concat on;
        }
        ...
    }
nginx -t
nginx

#模块化编译
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-http_concat_module=shared        
make dso_install
make && make install
ls /apps/nginx/modules/
#加载模块
vim /apps/nginx/conf/nginx.conf
dso {
    load ngx_http_concat_module.so;
}

实现nginx高并发Linux内核优化

  • 默认的Linux内核参数考虑的是最通用场景,不符合用于支持高并发访问的Web服务器的定义,根据业务特点来进行调整,当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时,内核参数的调整都是不同的,此处针对最通用的、使Nginx支持更多并发请求的TCP网络参数做简单的配置,修改/etc/sysctl.conf来更改内核参数

  • fs.file-max = 999999
    表示单个进程较大可以打开的句柄数

  • net.ipv4.tcp_tw_reuse = 1
    参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在

  • net.ipv4.tcp_keepalive_time = 600
    当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效链接

  • net.ipv4.tcp_fin_timeout = 30
    当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的较大时间

  • net.ipv4.tcp_max_tw_buckets = 5000
    表示操作系统允许TIME_WAIT套接字数量的较大值,如超过此值,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为8000,过多的TIME_WAIT套接字会使Web服务器变慢

  • net.ipv4.ip_local_port_range = 1024 65000
    定义UDP和TCP链接的本地端口的取值范围

  • net.ipv4.tcp_rmem = 10240 87380 12582912
    定义了TCP接受缓存的最小值、默认值、较大值

  • net.ipv4.tcp_wmem = 10240 87380 12582912
    定义TCP发送缓存的最小值、默认值、较大值

  • net.core.netdev_max_backlog = 8096
    当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值

  • net.core.rmem_default = 6291456
    表示内核套接字接受缓存区默认大小

  • net.core.wmem_default = 6291456
    表示内核套接字发送缓存区默认大小

  • net.core.rmem_max = 12582912
    表示内核套接字接受缓存区较大大小

  • net.core.wmem_max = 12582912
    表示内核套接字发送缓存区较大大小

  • 注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑

  • net.ipv4.tcp_syncookies = 1
    与性能无关。用于解决TCP的SYN攻击

  • net.ipv4.tcp_max_syn_backlog = 8192
    这个参数表示TCP三次握手建立阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可使出现Nginx繁忙来不及accept新连接时,Linux不至于丢失客户端发起的链接请求

  • net.ipv4.tcp_tw_recycle = 1
    这个参数用于设置启用timewait快速回收

  • net.core.somaxconn=262114
    选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。

  • net.ipv4.tcp_max_orphans=262114
    选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值

小笔记:keepalived+nginx实现高可用反向代理

#ka1:192.168.37.7,192.168.37.100、ka2:192.168.37.17,192.168.37.100、rs1:192.168.37.37、rs2:192.168.37.47

#ka1
yum install keepalived nginx -y
vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     admin@magedu.net       #发给本机root邮件
   }
   notification_email_from ka1@magedu.net
   smtp_server 127.0.0.1    #发邮件的地址
   smtp_connect_timeout 30
   router_id ka1        #主机名    
   vrrp_mcast_group4 224.0.0.100    #D类地址,多播
}
vrrp_script chk_down {      #自定义脚本
    #script "[ -f /etc/keepalived/down ] && exit 1 || exit 0"
    script "/etc/keepalived/chk_down.sh"
    interval 1
    weight -30
}
vrrp_script chk_nginx {
    script "/etc/keepalived/chk_nginx.sh"
    interval 1
    weight -30
}
vrrp_instance VI_1 {    #虚拟路由器
    state MASTER        #在另一个结点上为BACKUP
    interface eth0      #网卡接口
    virtual_router_id 10    #多个节点必须相同
    priority 100        #优先级,在另一个结点上要小于这个值
    advert_int 1        #通告间隔1s
    authentication {
        auth_type PASS  #预共享密钥认证
        auth_pass 123456    #密码
    }
    virtual_ipaddress {
        192.168.37.100/24 dev eth0 label eth0:1
    }
    track_script {      #引用脚本
        chk_down
        chk_nginx
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

vim /etc/keepalived/notify.sh
#!/bin/bash
contact='root@localhost'
notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    systemctl restart nginx
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac

vim /etc/nginx/nginx.conf
http {
    upstream websrvs {
        server 192.168.37.37:80;
        server 192.168.37.47:80;
        least_conn;
    }
    server {
        listen 80;
        location / {
            proxy_pass websrvs;
        }          
    }   
}
echo '[ -f /etc/keepalived/down ] && exit 1 || exit 0' > /etc/keepalived/chk_down.sh
echo 'killall -0 nginx &> /dev/null && exit 0 || exit 1' > /etc/keepalived/chk_nginx.sh
chmod +x  "/etc/keepalived/*.sh"
systemctl start keepalived nginx

#ka2
yum install keepalived nginx -y
vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     admin@magedu.net       #发给本机root邮件
   }
   notification_email_from ka2@magedu.net
   smtp_server 127.0.0.1    #发邮件的地址
   smtp_connect_timeout 30
   router_id ka2        #主机名    
   vrrp_mcast_group4 224.0.0.100    #D类地址,多播
}
vrrp_script chk_down {      #自定义脚本
    #script "[ -f /etc/keepalived/down ] && exit 1 || exit 0"
    script "/etc/keepalived/chk_down.sh"
    interval 1
    weight -30
}
vrrp_script chk_nginx {
    script "/etc/keepalived/chk_nginx.sh"
    interval 1
    weight -30
}
vrrp_instance VI_1 {    #虚拟路由器
    state BACKUP        #在另一个结点上为BACKUP
    interface eth0      #网卡接口
    virtual_router_id 10    #多个节点必须相同
    priority 80     #优先级,在另一个结点上要小于这个值
    advert_int 1        #通告间隔1s
    authentication {
        auth_type PASS  #预共享密钥认证
        auth_pass 123456    #密码
    }
    virtual_ipaddress {
        192.168.37.100/24 dev eth0 label eth0:1
    }
    track_script {      #引用脚本
        chk_down
        chk_nginx
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}

vim /etc/keepalived/notify.sh
#!/bin/bash
contact='root@localhost'
notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    systemctl restart nginx
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac

vim /etc/nginx/nginx.conf
http {
    upstream websrvs {
        server 192.168.37.37:80;
        server 192.168.37.47:80;
        least_conn;
    }
    server {
        listen 80;
        location / {
            proxy_pass websrvs;
        }          
    }
}
echo '[ -f /etc/keepalived/down ] && exit 1 || exit 0' > /etc/keepalived/chk_down.sh
echo 'killall -0 nginx &> /dev/null && exit 0 || exit 1' > /etc/keepalived/chk_nginx.sh
chmod +x  "/etc/keepalived/*.sh"
systemctl start keepalived nginx

#client
curl 192.168.37.100
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345