web运维第一篇:nginx配置文件详解笔记

#定义Nginx运行的用户和用户组
user www www;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#进程文件
pid /var/run/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工作模式与连接数上限
events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;
    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 65535;
}

#设定http服务器
http
{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒
    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    gzip_disable     "MSIE [1-6]\.";  #ie6以下的版本不开启压缩
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream www.itnihao.com {
    #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    server 10.10.10.10:80 weight=3 max_fails=2 fail_timeout=30s;
    server 10.10.10.11:80 weight=4 max_fails=2 fail_timeout=30s;
    server 10.10.10.12:80 weight=3 max_fails=2 fail_timeout=30s;
}


#虚拟主机的配置
server
{
    #监听端口
    listen 80;
    #域名可以有多个,用空格隔开
    server_name www.itnihao.com itnihao.com;
    index index.html index.htm index.php;
    root /data/web/www;
    #防止系统目录被访问
    location ~ (/.svn/|etc/passwd|etc/shadow|etc/group|etc/gshadow|etc/sudoers|nginx/nginx.conf|etc/my.cnf|sshd_config|ifconfig|bin/rm|bin/mkdir|bin/rmdir|bin/touch|usr/bin/vim|rsync.conf|redis.conf)
    {
        deny all;
    }


    #php解析
    location ~ .*.(php|php5)?$
    {
        #fastcgi_pass   unix:/tmp/fpm.sock;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;

    }
   
    #日志格式设定
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    #定义本虚拟主机的访问日志
    access_log /var/log/nginx/www.itnihao.com.access.log access;
    #对 "/" 启用反向代理
    location / {
        #如果后端的服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        #代理的服务器池名称
        proxy_pass https://www.itnihao.com;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #以下是一些反向代理的配置,可选。
        proxy_set_header Host $host;
        client_max_body_size 10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
        proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
        proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k;
        #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        
        if ($http_user_agent ~ (curl|LWP::Simple|winhttp|clshttp|HTTrack|harvest|nsauditor|dirbuster|pangolin|nmap|sqlninja|grendel-scan|hydra|perl|HTMLParser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|sae|zmeu|BabyKrokodil|python|netsparker|httperf|ApacheBench|webbench|JoeDog))
        {
              return 443;
        }
        #拒绝非法浏览器访问
        
    }
    #设定查看Nginx状态的地址
    location /NginxStatus {
        stub_status on;
        access_log off;
        #auth_basic "NginxStatus";
        #auth_basic_user_file conf/htpasswd;
        #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        allow 127.0.0.1;
        allow 192.168.11.0/24;
        deny all; 
    }
    #php-fpm的状态查看
    #需要开启php-fpm.conf中的pm.status_path = /phpfpmstatus
    location ~ ^/(phpfpmstatus)$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/fpm.sock;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    }

    #本地动静分离反向代理配置
    #所有jsp的页面均交由tomcat或resin处理
    location ~ .(jsp|jspx|do)?$ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
    #所有静态文件由nginx直接读取不经过tomcat或resin
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
        expires 15d;
    }
   }
}
       

nginx的调度算法

nginx的调度算法
1.轮询调度算法(Round-Robin Scheduling):
    轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数)
    对于一级后端服务器群,形成一个环队列的形式,对于每个到达的请求按时间顺序顺次分配给这些后端服务器。在前端调度器与后端服务器之间采用“心跳”方式进行状态检查,如果发现后端服务器宕机,则将其删除。
    这种方式为默认配置,优点是简洁,但缺点是无法进行最优化调度,有可能有的请求需要耗时较久,这样会带来一定的不平衡。
upstream lb {
        server 10.10.57.122:80;
        server 10.10.57.123:80;
}
2. 加权轮询
    这是一种对上述方式的改进,引入权值的概念,能够解决后端服务器性能不均的情况

upstream lb {
        server 10.10.57.122:80 weight=5;
        server 10.10.57.123:80 weight=10;
}
3.ip_hash:同一个ip总是被转发同一server
    这是一种非轮询式方式,对于每个到达的请求,直接通过其请求IP进行哈希的映射,通过映射结果获得那一台后端服务器要处理这个请求,这种方式有一个明显的好处是能够保证session的唯一性。
upstream lb {
        ip_hash;
        server 10.10.57.122:80;
        server 10.10.57.123:80;
}
4.url_hash(基于URL的哈希方式)  
    这种方式与IP的哈希方式类似,是对客户机请求的URL进行哈希操作,这样的方式有一个明显的好处是,能够便于内容缓存的实现,对于经常性的资源访问,采
upstream lb {
         server 10.10.57.122:80;
         server 10.10.57.123:80;
         hash $request_uri;
}
5.fair
    这种方式是根据服务器端的动态响应,对每一个请求进行分配。 这种方式能够自动根据当前的后端实际负载来优化。
upstream lb {
         server 10.10.57.122:80;
         server 10.10.57.123:80;
         fair;
}
      	

nginx防盗链

server {
        listen 80;
        server_name www.itnihao.com;
        charset utf-8;
        root /var/web/www;
        index index.php;

        location / {
        valid_referers none blocked www.itnihao.com;

        if ($invalid_referer) {
             return   411;
           }
        }
}
      	
用curl测试
curl https://www.itnihao.com -A "user_agentd" -e "https://www.itnihao.com"
返回200
curl https://www.itnihao.com -A "user_agentd" -e "http://www.itnihao.net"
返回411
这里只有一个重要的指令valid_referers:
这个指令在referer头的基础上为 $invalid_referer 变量赋值,其值为0或1。
可以使用这个指令来实现防盗链功能,如果valid_referers列表中没有Referer头的值, $invalid_referer将被设置为1。
参数可以使如下形式:
none意为不存在的Referer头
blocked意为根据防火墙伪装Referer头,如:“Referer: XXXXXXX”。
server_names为一个或多个服务器的列表,0.5.33版本以后可以在名称中使用“*”通配符

nginx连接状态解释

Active connections //当前 Nginx 正处理的活动连接数。
server accepts handled requests //总共处理了多少个连接 |成功创建多少次握手|总共处理了多少个请求。
Reading //nginx 读取到客户端的 Header 信息数。
Writing //nginx 返回给客户端的 Header 信息数。
Waiting //开启 keep-alive 的情况下,这个值等于 active – (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接

测试url返回状态

curl -o /dev/null -s -w %{http_code} https://www.itnihao.com

tcp连接状态

CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

统计tcp连接状态数

netstat -n|awk '/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]}'

© itnihao 2013