注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

simonzhang个人观点

http://www.simonzhang.net 镜像地址

 
 
 

日志

 
 

nginx 0.8 安装 配置  

2010-03-12 09:20:29|  分类: WEB系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

【整理人:张子萌  最近一次修改2010-12】  

nginx的官方网站:http://nginx.org/

 1.下载nginx源码
    nginx-0.8.34.tar.gz
   
    如果希望在Nginx中使用正则表达式使配置更灵活,需要安装PCRE。
    查看是否安装pcre
    # rpm -qa pcre*

    如果希望在是用ssl加密部分请安装openssl。

    如果希望压缩传送需要安装gzip
 
    如果使用nginx使用的缓存,需要清理指定url需要下载并同时编译。
    http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz

    推荐使用升级工具安装,升级工具使用可以参照:
    http://simon-zzm.blog.163.com/blog/static/88809522201025102237958/

 2. 编译安装nginx
    首先创建账户,指定用户与组的id均为700
    # groupadd -g 700 nginx
    # useradd -g700 -u700 nginx
    解压、安装nginx,对于不需要的模块可以不编译。
    最后一行为清理指定url模块,可以选择性编译
    # tar zxvf ngx_cache_purge-1.0.tar.gz
    # tar zxvf nginx-0.8.34.tar.gz
    # cd nginx-0.8.34
    # ./configure --prefix=/usr/local/nginx \
       --user=nginx \
       --group=nginx \
       --with-pcre \
       --with-select_module \
       --with-poll_module \
       --with-http_stub_status_module \
       --with-http_ssl_module \
       --with-http_realip_module \
       --with-http_gzip_static_module \
       --add-module=/usr/local/src/ngx_cache_purge-1.0
    # make && make install

3. nginx配置文件

   主要配置文件:/usr/local/nginx/conf/nginx.conf
# 程序运行用户
user  nginx nginx;
# 启动进程数
worker_processes  8;

#给每个进程分配cpu,例:将8个进程分配到8个cpu,也可以写多个,或将一个进程分配到多个cpu

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

# 全局错误日志和程序PID文件
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;

# 工作模式及连接数上限
# 工作模式有:select(标准模式),poll(标准模式),kqueue(高效模式,适用FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 and MacOS X),
# poll(高效模式。适用Linux 2.6+,SuSE 8.2,Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+)
events {
    use poll;
    worker_connections  1024;
}

# 设定http服务器,反向代理功能提供负载均衡支持
http {
    #设定mime类型
    include       mime.types;
    default_type  application/octet-stream;

    # 隐藏nginx版本,防止攻击
    server_tokens off;
    # 设定日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #设定access log
    #access_log  logs/access.log  main;
    #linux下强大的静态文件发送功能,一定要开启
    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  60;
    tcp_nodelay    on;

    # 定义一个叫“mysvr”的记录区,总容量为 10M
    # 和下面location中的limit_conn一起限制单个IP的并发连接数为10
    # limit_zone只能是用在http中,limit_conn可以使用在http、sever、local中
    limit_zone mysvr $binary_remote_addr  10m;

    #设定负载均衡的服务器列表
    upstream mysvr {
            ip_hash  #如果不需要可以删除直接采用轮训方法负载
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.0.1:80 weight=5;
            server 192.168.0.2:80 weight=1;
            server 192.168.0.3:80 weight=6;
            server 192.168.0.5:80;
            server 192.168.0.6:80;

        #down 表示单前的server暂时不参与负载
        #weight 默认为1.weight越大,负载的权重就越大。
        #max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
        #fail_timeout:max_fails次失败后,暂停的时间。
        #backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
        #ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
       }
    # 设定缓存临时目录,临时目录要与proxy_cache_path中目录一样
    proxy_temp_path /usr/local/nginx_test/proxy_temp;
    # proxy_cache_path中参数如下
    # levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母
    # keys_zone为这个空间起个名字,比如 cache_one,在server模块中proxy_cache使用
    # 200m 内存缓存空间大小为200MB
    # inactive 1天没有被访问的内容自动清除;
    # max_size使用硬盘缓存大小30G
    # clean_time指定一分钟清理一次缓存。
    proxy_cache_path /usr/local/nginx_test/proxy_temp/ levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

    #设定虚拟主机,默认为监听80端口
    server {
        listen       80;
        server_name  192.168.0.7 mysvr.com www.mysvr.com;
        #charset gb2312;      
        #charset utf8;
        #charset koi8-r;
        #设定本虚拟主机的访问日志
        #access_log  logs/host.access.log  main;
  
        #对 "/" 启用负载均衡    
 location / {
            proxy_pass     http://mysvr;
            proxy_redirect         off;
            proxy_set_header       Host $host;
            proxy_set_header       X-Real-IP $remote_addr;
            proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size   10m;   #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
            proxy_connect_timeout  90;   #与后端连接超时时间
            proxy_send_timeout     90;  #后端服务器回传超时时间
            proxy_read_timeout     90;  #连成功后,后端服务器响应超时时间。
            proxy_buffer_size      4k;   #代理服务器保存用户头信息的缓存大小
            proxy_buffers          4 32k;
            proxy_busy_buffers_size 64k; #高负荷缓村大小。大小计算方法proxy_buffers*2
            proxy_temp_file_write_size 64k;  #设定缓存文件大小,大于这个值经直接从upstream获得。
            limit_conn  mysvr 10; #每个IP只能有10个并发
            limit_rate 100k;  #每个并发只能有100K的速度
            index index.html index.htm; #选则文件后缀解析都优先顺序
            expires 30d;  #客户端缓存时间 30天

               }

 

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status            on;
            access_log             on;
            auth_basic             "NginxStatus";
        #    auth_basic_user_file conf/htpasswd;
               }
       #对于php jsp cgi动态语言不适用缓存
       location ~ .*\.(php|jsp|cgi)?$
            {
            proxy_redirect         off;
            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://mysvr;
            expires 30d;
            }
           #缓存静态页面和gif图片等
           location ~* .(html|htm|gif|js|css)$ {
            expires 30d;
            proxy_cache cache_one;
            # 以下配置HTTP CODE为200,304,301,302的都缓存一个小时
            #proxy_cache_valid  200 304 1h;
            #proxy_cache_valid  301 302 1h;
            # 其他类型保存1分钟
            # proxy_cache_valid any 1m;
            # 缓存的文件名是主机名+地址+参数
            proxy_cache_key $host$uri$is_args$args;
            # 其他类型保存1分钟
            proxy_cache_valid any 1m;
            # 缓存的文件名是主机名+地址+参数
            proxy_cache_key $host$uri$is_args$args;
            # 转发请求头文件,否则在本地没有缓存情况下,转发将不会转发请求头文件
            proxy_redirect          off;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
            #关闭访问日志
            access_log off;
            if ( !-f $request_filename){
               proxy_pass    http://mysvr;
             }
        }
       #用于清除缓存,举例URL为http://mysvr/test.txt,通过访问http://mysvr/purge/test.txt就可以清除该URL的缓存。
       #此处由网络搜集,暂时未测试通过
       location ~ /purge(/.*)
           {
           #设置只允许指定的IP或IP段才可以清除URL缓存。
           allow            127.0.0.1;
           allow            192.168.0.0/16;
           deny            all;
           proxy_cache_purge    cache_one   $host$1$is_args$args;
           }   

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    ###############################################对于未知的域名进行301跳转
    server {
        listen       80;
        server_name *.cn *.com *.com.cn *.net *.net.cn *.in;
        if ($host != 'www.mysvr.com' ) {
              rewrite ^/(.*)$ http://www.mysvr.com/$1 permanent;
              rewrite ^(.*)$ http://www.mysvr.com  permanent;
             }
         }

    ###############################################php-fmp配置
    server {
        listen       80;
        server_name localhost ;
        root /program/nagios;
        index index.html index.htm index.php;
        location ~ .*\.(php|php5)?$ {
                fastcgi_pass  127.0.0.1:9000;
                fastcgi_index index.php;
                include fcgi.conf;
                }
       }

    }

}

 

4. nginx日常操作
 
nginx可接受的信号如下:
Signal    Action
TERM, INT  Terminate the server immediately
QUIT  Stop  the server
HUP  Configuration changes, start new workers, graceful stop of  old workers
USR1  Reopen log files
USR2  Upgrade the server  executable
WINCH  Graceful Stop (parent process advise the children to  exit)

测试配置是否正确:/usr/local/nginx/sbin/nginx -t
快速重启脚本命令:kill -HUP `cat /data/nginx/logs/nginx.pid`
查看tcp/ip连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

脚本:
#!/bin/sh
base_path=/usr/local/nginx
open_port=80

case $1 in
start)
  $base_path/sbin/nginx -c $base_path/conf/nginx.conf
;;
stop)
  /usr/sbin/lsof -i :$open_port|grep root|awk ' ''{print $2}'|xargs kill
;;
test)
 $base_path/sbin/nginx -t
;;
restart)
   kill -HUP `cat $base_path/logs/nginx.pid`
;;
status)
  /usr/sbin/lsof -i :$open_port|grep root
;;
*)
  echo 'start,stop,restart,test,status'
;;
esac


5.浏览当前状态
http://www.xxxx.com/NginxStatus
显示网页信息解释:
active connections:当前Nginx正处理的活动连接数。
server accepts handled requests
总共处理的连接个数 , 成功创建握手连接个数,总共处理请求个数 ( 平均每次握手处理了 1.3 个数据请求 )。
reading:nginx 读取到客户端的 Header 信息数。
writing:nginx 返回给客户端的 Header 信息数。
waiting:开启 keep-alive 的情况下,这个值等于active(reading + writing),
         意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。


6. 日志与优化

日志部分
nginx默认日志有3个:
access.log 正常访问日志
error.log 访问错误日志
nginx.pid nginx在系统中的进程号


6.1对于nginx服务优化主要
 
6.2多系统做优化
# vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_keepalive_time = 500
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
net.core.netdev_max_backlog =8096

# vi /etc/security/limits.conf
* soft nofile 10240
* hard nofile 20480
* - mproc 10240

注:sysctl.conf解释

net.ipv4.tcp_max_tw_buckets = 6000

timewait的数量,默认是180000。

net.ipv4.ip_local_port_range = 1024    65000

允许系统打开的端口范围。

net.ipv4.tcp_tw_recycle = 1

启用timewait快速回收。

net.ipv4.tcp_tw_reuse = 1

开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_syncookies = 1

开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

net.core.somaxconn = 262144

web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

net.core.netdev_max_backlog = 262144

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不

能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_max_syn_backlog = 262144

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_timestamps = 0

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries = 1

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 1

在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_fin_timeout = 1

如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你

可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能

吃掉1.5K内存,但是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30

当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

下面贴一个完整的内核优化设置:


引用
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024    65000

 


附录

参考网页:
http://hillside.javaeye.com/blog/559772
http://www.linuxeden.com/html/sysadmin/20080725/59827.html
http://www.oschina.net/bbs/thread/1579
http://blog.s135.com/nginx_cache/
http://blog.chinaunix.net/u2/81136/showart_1864687.html

  评论这张
 
阅读(562)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017