一、ubuntu安装nginx

1.更新源

sudo apt-get update 
sudo apt-get upgrade

2.安装nginx

sudo apt-get install nginx 
nginx -v

3.配置nginx

nginx配置文件主要分为六个区域:

main 控制子进程的所属用户/用户组、派生子进程数、错误日志位置/级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等
events 控制nginx处理连接的方式
http http服务
sever 主机设置
location url规则
upstream 负载均衡

进入配置文件

sudo vim /etc/nginx/nginx.conf

配置文件信息如下:

user www-data;    # 运行用户
worker_processes 1;  # 启动进程数,通常设置成和cpu的数量相等
error_log /var/log/nginx/error.log;  # 全局错误日志
pid /var/run/nginx.pid; # PID文件

events {
  use epoll;   # 使用epoll多路复用模式
  worker_connections  1024; # 单个后台worker process进程的最大并发链接数
  # multi_accept on; 
}

http {
  include /etc/nginx/mime.types; # 设定mime类型,类型由mime.type文件定义
  default_type  application/octet-stream;
  access_log  /var/log/nginx/access.log;  # 设定访问日志
  sendfile  on;   # 平衡网络传输与网速
  #tcp_nopush     on; # 在一个数据包里发送所有头文件,而不一个接一个的发送
  keepalive_timeout  65;# 连接超时时间
  tcp_nodelay  on;# 作用于socket参数TCP_NODELAY,禁用nagle算法,也即不缓存数据
  gzip  on;# 开启gzip压缩
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  client_header_buffer_size    1k; # 设定请求缓冲
  large_client_header_buffers  44k;

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;

  # 设定负载均衡的服务器列表
upstream mysvr {
    # weigth参数表示权值,权值越高被分配到的几率越大
    server 192.168.8.1:3128 weight=5; # 本机上的Squid开启3128端口
    server 192.168.8.2:80 weight=1;
    server 192.168.8.3:80 weight=6;
  }

server {
  listen 80; # 侦听80端口
  server_name  www.xx.com; # 定义使用www.xx.com访问
  access_log  logs/www.xx.com.access.log  main; # 设定本虚拟主机的访问日志


location / {    # 默认请求
    root   /root;       # 定义服务器的默认网站根目录位置
    index index.php index.html index.htm;  # 定义首页索引文件的名称
    fastcgi_pass  localhost:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name; 
    include /etc/nginx/fastcgi_params;  
    }

error_page   500 502 503 504 /50x.html;  # 定义错误提示页面
location = /50x.html {
      root   /root;
    }

# 静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
      root /var/www/virtual/htdocs;
      expires 30d; # 过期时间30天
    }

    
location ~ \.php$ {  # PHP脚本请求全部转发到FastCGI处理,使用FastCGI默认配置
      root /root;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
      include fastcgi_params;
    }

   
location /NginxStatus {  # 设定查看Nginx状态的地址
      stub_status on;
      access_log on;
      auth_basic "NginxStatus";
      auth_basic_user_file conf/htpasswd;
    }

    
location ~ /\.ht {  # 禁止访问 .htxxx 文件
      deny all;
    }
  }

二、nginx常见问题总结

1.ip限制

http 字段加入以下内容

limit_req_zone $binary_remote_addr zone=perip:10m rate=60r/s;

limit_conn_zone $binary_remote_addr zone=perconn:10m;

server {
    listen 80;
    server_name www.zhangluya.com;
    charset utf-8;

location / {
    limit_req zone=perip burst=1500;
    # limit_req zone=one burst=8 nodelay; #不用队列burst=0
    # allow only sixty connection per an IP address at a time
    limit_conn perconn 100;
    proxy_pass http://127.0.0.1:81;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

2.自定义404页面

a. nginx自己的错误页面

server {
    listen      80;
    server_name  www.test.com;
    root   /var/www/test;
    index  index.html index.htm;

    location / {

    }

    # 定义错误页面码,如果出现相应的错误页面码,转发到那里。
    error_page  404 403 500 502 503 504  /404.html;
    location = /404.html { # 承接上面的location。
    root   /usr/share/nginx/html;  # 放错误页面的目录路径。
    }
}

b.反向代理错误页面

如果后台Tomcat处理报错抛出404,想把这个状态叫Nginx反馈给客户端或者重定向到某个连接,配置如下:

upstream www {
    server 192.168.1.201:7777  weight=20 max_fails=2 fail_timeout=30s;
    ip_hash;
}

server {
    listen  80;
    server_name www.test.com;
    root   /var/www/test;
    index  index.html index.htm;

    location / {
        if ($request_uri ~* ‘^/$’) {
            rewrite .*   http://www.test.com/index.html redirect;
}

        # 关键参数:这个变量开启后,我们才能自定义错误页面,当后端返回404,
        proxy_intercept_errors on;
        proxy_pass      http://www;
        proxy_set_header HOST   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-FOR $proxy_add_x_forwarded_for;
    }
    error_page    404  /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }
}

c.Nginx解析php代码的错误页面

如果后端是php解析的,需要加一个变量,在http段中加一个变量 fastcgi_intercept_errors on 就可以了。指定一个错误页面:

error_page    404  /404.html;
location = /404.html {
    root   /usr/share/nginx/html;
}
error_page 404  /404.html; #指定一个url地址:
error_page 404 = http://www.test.com/error.html;

3.上传大文件超时出错

修改Nginx读取超时间与发请求超时间.

nginx配置参数如下:

fastcgi_connect_timeout 300; #连接超时 
fastcgi_read_timeout 600;    #读超时 
fastcgi_send_timeout 600;    #写超时

#选项注解:

fastcgi_read_timeout #FastCGI进程向Nginx进程发送response,整个过程的超时时间 
fastcgi_send_timeout #Nginx进程向FastCGI进程发送request,整个过程的超时时间

4.网络爬虫过滤

现在有许多初学者学习网络爬虫,但他们不懂得控制速度,导致服务器资源浪费。通过Nginx的简单配置,能过滤一小部分这类爬虫。

a. 通过 User-Agent 过滤

参考配置如下:

location / {
        if ($http_user_agent ~* "scrapy|python|curl|java|wget|httpclient|okhttp") {
            return 503;
        }
        # 正常请求
    }

b. block IP

通过禁止某个 IP 或者某个 IP 段访问,也能起到一定效果。 Nginx 示例配置如下:

deny 178.238.234.1; 
deny 1.32.128.0/18;

c. rate limit

通过限制某个 IP 的访问频率,避免一部分 CC (Challenge Collapsar)攻击。

Nginx 示例配置如下:

http{ 
    #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
    #以$binary_remote_addr 为key,限制平均每秒的请求为20个,
    #1M能存储16000个状态,rete的值必须为整数,
    #如果限制两秒钟一个请求,可以设置成30r/m
    limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
    ...
    server{
        ...
        location {
            ...
            #限制每ip每秒不超过20个请求,漏桶数burst为5
            #brust的意思就是,如果第1秒、2,3,4秒请求为19个,
            #第5秒的请求为25个是被允许的。
            #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
            #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
            #第1秒25个请求时,5个请求放到第2秒执行,
            #设置nodelay,25个请求将在第1秒执行。

            limit_req zone=allips burst=5 nodelay;
            ...
        }
        ...
    }
    ...
}

当然,攻击者也可以使用代理IP来破除频率限制。建议在网站前面加一层 CDN。

5.防盗链

如果您使用的是默认站点,也就是说,您的站点可以直接输入服务器IP访问的,使用root登录,修改 /usr/local/nginx/conf/nginx.conf 这个配置文件。

如果您新建了站点,那么修改/usr/local/nginx/conf/vhost/你的域名.conf 这个配置文件,找到:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {      expires      30d; }

把这一段删掉,修改成:

location ~* \.(gif|jpg|png|jpeg)$ {
    expires     30d;
        valid_referers none blocke *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
    if ($invalid_referer) {
    rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;
    #return 404;
    }}

第一行: location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$

其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!

第三行:valid_referers none blocked *.http://it300.com it300.com;

就是白名单,允许文件链出的域名白名单,自行修改成您的域名!*.http://it300.com这个指的是子域名,域名与域名之间使用空格隔开!

第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;

这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。

这样设置差不多就可以起到防盗链作用了,上面说了,这样并不是彻底地实现真正意义上的防盗链!

我们来看第三行:valid_referers none blocked *.http://it300.com it300.com;

valid_referers 里多了“none blocked”

我们把“none blocked”删掉,改成

valid_referers *.http://it300.com it300.com;

nginx彻底地实现真正意义上的防盗链完整的代码应该是这样的:

location ~* \.(gif|jpg|png|jpeg)$ {
    expires     30d;
    valid_referers *.hugao8.com www.hugao8.com m.hugao8.com ;
    if ($invalid_referer) {
    rewrite ^/ http://ww4.sinaimg.cn/bmiddle/gjc4xl7srj20cm08aaa6.jpg;
    #return 404;
    }
    }

这样您在浏览器直接输入图片地址就不会再显示图片出来了,也不可能会再右键另存什么的。

第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;

这个是给图片防盗链设置的防盗链返回图片,如果我们是文件需要防盗链下载,把第五行:

rewrite ^/ http://www.it300.com/static/images/404.jpg;

改成一个链接,可以是您主站的链接,比如把第五行改成:

rewrite ^/ http://www.it300.com;

这样,当别人输入文件下载地址,由于防盗链下载的作用就会跳转到您设置的这个链接!

最后,配置文件设置完成别忘记重启nginx生效!

6. 验证token

location ~ /private/.+\.mp4$ {
    root html;
    access_by_lua '
        local appIdKeys = {["app_1"] = "key_1", ["app_2"] = "key_2"};
        local args   = ngx.req.get_uri_args();
        local appId  = args["appId"];
        local appKey = appIdKeys[appId];
        local token1 = args["token"]; #参数中 token
        #用应用的 ID 找到对应的 key,然后根据算法计算 token
        local token2 = ngx.md5(appId .. appKey); 
       #如果参数中的 token 和计算得到的 token 不相等,
        #则说明访问非法,禁止访问,否则放行访问
        if token1 ~= token2 then
            ngx.exit(ngx.HTTP_FORBIDDEN);
        end
    ';
}

7.ddos防御

a.限制每秒请求数

ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。配置需要在两个地方设置:

  • nginx.conf的http段内定义触发条件,可以有多个条件
  • 在location内定义达到触发条件时nginx所要执行的动作

例如:

http {
    //触发条件,所有访问ip 限制每秒10个请求
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; 
    server {
        location  ~ \.php$ {
            limit_req zone=one burst=5 nodelay;   //执行的动作,通过zone名字对应
               }
           }
     }

参数说明:

$binary_remote_addr  二进制远程地址 
zone=one:10m    定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话 
rate=10r/s;     限制频率为每秒10个请求 
burst=5         允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
nodelay         超过的请求不被延迟处理,设置后15个请求在1秒内处理。

b.限制IP连接数

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m; //触发条件
    server {
        location /download/ {
            limit_conn addr 1;    // 限制同一时间内1个连接,超出的连接返回503
                }
           }
     }

c.白名单设置

http_limit_conn和http_limit_req模块限制了单ip单位时间内的并发和请求数,但是如果Nginx前面有lvs或者 haproxy之类的负载均衡或者反向代理,nginx获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要geo和map 模块设置白名单:

geo $whiteiplist  {
        default 1;
        10.11.15.161 0;
    }
map $whiteiplist  $limit {
        1 $binary_remote_addr;
        0 "";
    }
limit_req_zone $limit zone=one:10m rate=10r/s;
limit_conn_zone $limit zone=addr:10m;

geo模块定义了一个默认值是1的变量whiteiplist,当在ip在白名单中,变量whiteiplist的值为0,反之为1

如果在白名单中–> whiteiplist=0 –> $limit=”” –> 不会存储到10m的会话状态(one或者addr)中 –> 不受限制

反之,不在白名单中 –> whiteiplist=1 –> $limit=二进制远程地址 –>存储进10m的会话状态中 –> 受到限制

d.测试

使用ab命令来模拟CC攻击,http_limit_conn和http_limit_req模块要分开测试,同时注意 http_limit_conn模块只统计正在被处理的请求(这些请求的头信息已被完全读入)所在的连接。如果请求已经处理完,连接没有被关闭时,是不会 被统计的。这时用netstat看到连接数可以超过限定的数量,不会被阻止。

ab -n 请求数 -c 并发 http://10.11.15.174/i.php

如果被阻止前台会返回503,同时在nginx的error_log中会看到如下错误日志:

被限制连接数:

2015/01/28 14:20:26 [error] 4107#0: *65525 limiting connections by zone "addr", client: 10.11.15.161, server: , request: "GET /i.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1", host: "10.11.15.174", referrer: "http://10.11.15.174/i.php"

被限制请求数:

2015/01/28 14:18:59 [error] 4095#0: *65240 limiting requests, excess: 5.772 by zone "one", client: 10.11.15.161, server: , request: "GET /i.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1", host: "10.11.15.174", referrer: "http://10.11.15.174/i.php"

e.其它一些防CC的方法

1、Nginx模块 ModSecurity、http_guard、ngx_lua_waf

ModSecurity 应用层WAF,功能强大,能防御的攻击多,配置复杂
ngx_lua_waf 基于ngx_lua的web应用防火墙,使用简单,高性能和轻量级
http_guard 基于openresty

2、软件+Iptables

fail2ban 通过分析日志来判断是否使用iptables拦截
DDoS Deflate 通过netstat判断ip连接数,并使用iptables屏蔽

开头说过抗DDOS是一个系统工程,通过优化系统和软件配置,只能防御小规模的CC攻击,对于大规模攻击、四层流量攻击、混合攻击来说,基本上系统和应用软件没挂,带宽就打满了。下面是我在工作中使用过的防御DDOS的方式:

高防服务器和带流量清洗的ISP 通常是美韩的服务器,部分ISP骨干供应商有流量清洗服务,例如香港的PCCW。通常可以防御10G左右的小型攻击
流量清洗服务 例如:akamai(prolexic),nexusguard 我们最大受到过80G流量的攻击,成功被清洗,但是费用非常贵
CDN 例如:百度云加速。

8.tomcat nginx上传文件大小限制

a.关于在tomcat在server.xml的配置文件上传大小20M的限制 – maxPostSize=”20971520″

<Connector port="8080" protocol="HTTP/1.1"
                           maxThreads="200" 
                           minSpareThreads="25" 
                           maxSpareThreads="100"
                           acceptCount="200"
                           maxPostSize="20971520"
                           connectionTimeout="30000"
                           enableLookups="false"
                           disableUploadTimeout="true"
                           compression="on"
                           compressableMimeType="text/html,text/xml,text/plain,text/css,
                           text/javascript,text/json,application/x-javascript,
                           application/javascript,application/json"
                       noCompressionUserAgents="gozilla, traviata"
               redirectPort="8443" />

b.在nginx的nginx.conf的配置文件上传大小为20M – client_max_body_size 20m;

location /gw/file/upload {
            proxy_pass http://127.0.0.1/upload;
            proxy_redirect  off;
            proxy_set_header        Host    $http_host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   Cookie $http_cookie;
            client_max_body_size   20m;
}

三、日志处理

1.awk查看统计Nginx访问日志

nginx日志最好实现每天定时切割下,特别是在访问量比较大的时候,方便查看与处理,如果没切割,可以用sed直接切割,

切割日志

查找7月17日访问log导出到17.log文件中:

cat gelin_web_access.log | egrep "17/Jul/2017" | sed  -n '/00:00:00/,/23:59:59/p' > /tmp/17.log

查看访问量前10的IP

awk '{print $1}' 17.log | sort | uniq -c | sort -nr | head -n 10

查看访问前10的URL

awk '{print $11}' gelin_web_access.log | sort | uniq -c | sort -nr | head -n 10

查询访问最频繁的URL

awk '{print $7}' gelin_web_access.log | sort | uniq -c | sort -n -k 1 -r | more

查询访问最频繁的IP

awk '{print $1}' gelin_web_access.log | sort | uniq -c | sort -n -k 1 -r | more

根据访问IP统计UV

awk '{print $1}' gelin_web_access.log | sort | uniq -c | wc -l

统计访问URL统计PV

awk '{print $7}' gelin_web_access.log | wc -l

根据时间段统计查看日志

cat gelin_web_access.log | sed -n '/17\/Jul\/2017:12/,/17\/Jul\/2017:13/p' | more

2.自动屏蔽访问频繁的ip

a.工作原理

Nginx 配置中,可以通过 allow , deny ip 来进行权限屏蔽。因此,需要创建一个 blockip.conf ,将屏蔽的 IP 保存在里面,并加载至 Nginx 配置中。例子:

allow 1.1.1.1;  
allow 1.1.1.2; 
deny all;

全站屏蔽:include blockip.conf; 放到 http {} 语句块。

单站屏蔽:include blockip.conf; 放到对应网站 server{} 语句块。

b.Shell 脚本

注意:相关参数需要自行配置。脚本示例的环境配置是根据 LNMP 安装包而定。

#!/bin/bash
nginxPath=/usr/local/nginx/
wwwPath=/home/wwwlogs/
tail -n50000 $wwwPath/access.log |awk '{print $1,$12}' |grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou" |awk '{print $1}'|sort|uniq -c|sort -rn |awk '{if($1>1000) print "deny "$2 ";"}' >> $nginxPath/conf/blockip.conf
sort $nginxPath/conf/blockip.conf | uniq -c |awk '{print "deny "$3}' > $nginxPath/conf/blockip.conf
/etc/init.d/nginx reload

c.定时任务

把Shell脚本改变权限并添加到定时计划中。

# 比如 Shell 脚本名为 blockip.sh 所在目录为 /root/ 定时任务为每天晚上11点30分执行 
30 23 * * * /root/blockip.sh

3.日志常用统计

IP相关统计

统计IP访问量

awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(4-5点)

grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l

查看访问最频繁的前100个IP

awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100

查看访问100次以上的IP

awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

查询某个IP的详细访问情况,按访问频率排序

grep '104.217.108.66' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100

页面访问统计

查看访问最频的页面(TOP100)

awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100

查看访问最频的页面([排除php页面】(TOP100)

grep -v ".php" access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100

查看页面访问次数超过100次的页面

cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

查看最近1000条记录,访问量最高的页面

tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

每秒请求量统计

统计每秒的请求数,top100的时间点(精确到秒)

awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

每分钟请求量统计

统计每分钟的请求数,top100的时间点(精确到分钟)

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

每小时请求量统计

统计每小时的请求数,top100的时间点(精确到小时)

awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

性能分析

在nginx log中最后一个字段加入$request_time

列出传输时间超过 3 秒的页面,显示前20条

cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

蜘蛛抓取统计

统计蜘蛛抓取次数

grep 'Baiduspider' access.log |wc -l

统计蜘蛛抓取404的次数

grep 'Baiduspider' access.log |grep '404' | wc -l

TCP连接统计

查看当前TCP连接数

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort

四、nginx调优

nginx运行进程个数

worker_processes  4;

表示启动nginx process数. 一般建议设置为cpu核心数或者核心数*2

cpu亲和力

如果cpu为四核心,设置进程数为4

worker_processes  4; worker_cpu_affinity 0001 0010 0100 1000;

如果cpu为八核心,设置进程数为8

worker_processes  8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

此配置项是将nginx每个进程绑定到固定的cpu核心上.不会造成进程频繁地切换cpu而占用更多的资源

nginx打开文件的最大个数

worker_rlimit_nofile 102400;

在修改这个参数之前同时需要修改操作系统限制的最大打开文件数量

ulimit -n       #显示当前系统限制同时打开文件数量 
ulimit -n 102400    #临时修改系统限制 
vim /etc/security/limits.conf       #修改系统配置文件 
* soft nofile 102400 
* hard nofile 102400

Nginx事件处理模型

events {     
use epoll;     
worker_connections  10240; 
}

use:使用的事件模型,网上表示epoll处理效率高,具体也不是很清楚
worker_connections:单进程的最大可连接数

连接超时时间

tcp在建立连接之时需要进行三次握手,断开时四次挥手。如果需要不停的加载资源,极大的占用了系统资源与时间。

keepalive选项则是连接建立之后,进行一段时间的等待,减少了握手与挥手的时间损耗。

然而长连接却也占用了系统资源,这个选项的参数设置也是需要根据实际情况来调整

keepalive_timeout  65; 
tcp_nodelay on; 
client_header_timeout 15; 
client_body_timeout 15; 
send_timeout 15;

keepalived_timeout 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
tcp_nodelay;也是防止网络阻塞,不过要包含在参数keepalived才有效
client_header_timeout 客户端请求头读取超市时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout 客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示
send_timeout 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超哥这个时间,客户端没有任何活动,nginx关闭连接

上传文件大小限制

http {     ...     clinet_max_body_size 10m;     }

gzip压缩

使用gzip压缩可以给我们节省带宽成本,提高传输速度,但是也会占用cpu资源

nginx需要启用with-http_gzip_static_module才可以使用

gzip on; 
gzip_min_length  1k; 
gzip_buffers     4 32k; 
gzip_http_version 1.1; 
gzip_comp_level 9; 
gzip_types  text/css text/xml application/javascript;
gzip_vary on;

gzip on; #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; #压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 9; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型总是会被压缩。
gzip_vary on; #vary header支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据

缓存调优

主要是针对图片,css,js这种元素修改机会较少的情况使用。

特别是图片,占用带宽大。

我们列出匹配这些的url

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
      {
      expires      30d;
      }
location ~ .*\.(js|css)?$
      {
      expires      10d;
      }

expires参数表示缓存时间。

五、运行环境搭建

1.php环境

对于Docker来说,最大的便利就是能快速的搭建起一个个的容器,容器之间可以通过网络和文件来进行通信。

之前我已经将自己的博客使用docker搭建起来了,这里简单记录一下docker-compose文件内容。

架构为lnmp,依赖的容器有:

Nginx(Port:80)
mariadb(Port:3306)
wordpress+php7.0-fpm(Port:9000)
phpmyadmin(Port:8009)

docker-compose.yml文件内容如下

nginx:
    image: nginx:latest
    ports:
        - '80:80'
    volumes:
        - ./nginx:/etc/nginx/conf.d
        - ./logs/nginx:/var/log/nginx
        - ./jialeens:/var/www/html
    links:
        - wordpress
    restart: always

mysql:
    image: mariadb
    ports:
        - '3306:3306'
    volumes:
        - ./db-data:/var/lib/mysql
    environment:
        - MYSQL_ROOT_PASSWORD=******
    restart: always

wordpress:
    image: wordpress:4.8.0-php7.0-fpm
    ports:
        - '9000:9000'
    volumes:
        - ./jialeens:/var/www/html
    environment:
        - WORDPRESS_DB_NAME=***
        - WORDPRESS_TABLE_PREFIX=wp_
        - WORDPRESS_DB_HOST=mysql
        - WORDPRESS_DB_PASSWORD=*****
    links:
        - mysql
    restart: always
phpmyadmin:
  image: phpmyadmin/phpmyadmin
  links:
    - mysql
  environment:
    PMA_HOST: mysql
    PMA_PORT: 3306
  ports:
    - '8009:80'

Nginx配置文件:

jialeens.com.conf

server {
    listen 80;
    server_name jialeens.com www.jialeens.com;

    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    client_max_body_size 100m;
    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/jialeens-access-http.log;
    error_log /var/log/nginx/jialeens-error-http.log;

    if ($host = 'jialeens.com') {
        return 301 http://www.jialeens.com$request_uri;
    }
    location ~* ^.+\.(js|ico|gif|jpg|jpeg|png|html|htm)$ {
       log_not_found off;
       access_log off;
       expires 7d;
    }
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "upload_max_filesize=128M \n post_max_size=128M";
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

2.flask运行环境

3.django运行 环境

4.负载均衡

    版权声明:

     本网站的所有文字、图片资料,未标注转字的均由作者亲自整理创作,如需复制、转载、转贴等方式发布/发表,请以锚链接的方式显示原文出处,请尊重我的劳动成果,侵权必究。本网站转载的文章如有侵权的地方请及时联系本人,核对后会第一时间删除!

阿沐
1625139774@qq.com

发表评论