Nginx安装配置详解

标签: nginx | 发表时间:2013-03-05 13:05 | 作者:hguisu
分享到:
出处:http://blog.csdn.net

Nginx

1.   Nginx安装

1)下载Nginx: wget http://nginx.org/download/nginx-1.3.11.tar.gz /opt/

2)安装Nginx

./configure
--user=www --group=www 
--prefix=/usr/local/nginx 
--with-http_stub_status_module 
--with-http_ssl_module 
--with-http_sub_module 
--with-md5=/usr/lib -
-with-sha1=/usr/lib 
--with-http_gzip_static_module

       认安装的路径是/usr/local/nginx

  1. --with-http_stub_status_module #nginx状态
  2. --with-http_ssl_module #支持HTTPS
  3. --with-http_sub_module #支持URL重定向
  4. --with-pcre=/usr/include/pcre/ (启用正规表达式) 
  5. --with-md5=/usr/lib #md5是一种加密算法
  6. --with-http_memcached_module (启用memcache缓存) 
  7. --with-http_rewrite_module (启用支持url重写)
  8. --with-sha1=/usr/lib #安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要
  9. --with-http_gzip_static_module #这个模块在一个预压缩文件传送到开启Gzip压缩的客户端之前检查是否已经存在以“.gz”结尾的压缩文件,这样可以防止文件被重复压缩
然后make; make install

3)启动及重启 
启动:/usr/local/nginx/sbin/nginx 
重启:kill -HUP `cat /usr/local/nginx/logs/nginx.pid` 

停止nginx:pkill -9 nginx

测试配置文件:nginx -t

2.  安装php的php-fpmn

装php5.3.5

./configure  --prefix=/usr/local/php   -enable-fpm

make;make install;

这里最重要的是--enable-fpm。因为默认情况下Nginx和PHP他俩之间是一点感觉没有的。在之前,很多朋友都搭建过Apache+PHP,Apache+PHP编译后生成的是模块文件,而Nginx+PHP需要PHP生成可执行文件才可以,所以要利用fastcgi技术来实现N ginx与PHP的整合,这个只要我们安装是启用FastCGI即可。此次我们安装PHP不仅使用了FastCGI,而且还使用了PHP-FPM这么一个东东,PHP-FPM说白了是一个管理FastCGI的一个管理器,它作为PHP的插件纯在,在安装PHP要想使用PHP-FPM时在老php的老版本就需要把PHP-FPM以补丁的形式安装到PHP中,而且PHP要与PHP-FPM版本一致,这是必须的)

PHP-FPM是一个PHP FastCGI管理器(php-FastCGI Process Manager),是只用于PHP的。
  PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
  相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
  PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。


       fastcgi已经在php5.3.5的core中了,不必再configure时--enable-fastcgi了。老版本的需要加,比如5.2。

php-fpm进行启动:/usr/local/php/sbin/php-fpm

需要配置php/etc/php-fpm.conf:

listen_address  127.0.0.1:9000 #这个表示php的fastcgi进程监听的ip地址以及端口
user=nobody 表示php的fastcgi进程以什么用户以来运行,默认该行是注释掉的,需要打开
group=nobody  表示php的fastcgi进程以什么用户组来运行,默认该行是注释掉的,需要打开
display_errors  0  是否显示php错误信息
max_children 5  最大的子进程数目

启动错误:m.min_spare_servers(0) must be a positive value 。
编辑php-fpm.conf找到pm.min_spare_server ;pm.min_spare_servers = 5 去除";"号
也可使用sed -i 's/;pm.min_spare_servers/pm.min_spare_servers/g' /usr/local/php/etc/php-fpm.conf 进行替换


提示错误:Nov 20 17:57:14.210553 [ALERT] [pool www] pm.max_spare_servers(0) must be a positive value
编辑php-fpm.conf找到pm.max_spare_servers = 35 和pm.min_spare_servers = 5 去除";"号

 

提示错误:Nov 20 17:58:55.248268 [WARNING] [pool www] pm.start_servers is not set. It's been set to 20
编辑php-fpm.conf找到 pm.start_servers = 20去除";"号
启动成功。

启用 php-fpm 的 slow log 日志:

启用 php-fpm 的 slow log 日志,查看执行时间过长的php文件,并将执行时间过长的进程直接终止掉!看看效果如何!

具体操作方法也简单,就修改一个文件,执行命令:# vi /usr/local/php/etc/php-fpm.conf   如果在这个php-fpm.conf 文件找不到 可以再/etc/php-fpm.d/www.conf 文件里面找

PHP 5.3.3 之前版本设置如下:

The timeout (in seconds) for serving a single request after which the worker process will be terminated       Should be used when 'max_execution_time' ini option does not stop script execution for some reason       '0s' means 'off'      
   request_terminate_timeout">  10s     
  The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file       '0s' means 'off'      
   request_slowlog_timeout">  1s   
    The log file for slow requests      
 logs/slow.log

PHP 5.3.3 之后版本设置如下:

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'. 
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) 
; Default Value: 0 request_slowlog_timeout = 1s 
; The log file for slow requests 
; Default Value: /usr/local/php/log/php-fpm.log.slow slowlog = /usr/local/php/log/php-fpm.log.slow ; The timeout for serving a single request after which the worker process will 
; be killed. This option should be used when the 'max_execution_time' ini option 
; does not stop script execution for some reason. A value of '0' means 'off'. 
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 request_terminate_timeout = 10s

注: request_terminate_timeout 将执行时间太长的进程直接终止

request_slowlog_timeout 将执行过慢的文件写入日志

以后即可根据慢执行日志 /usr/local/php/logs/slow.log 来优化程序文件了!

 

3.  配置Nginx运行php

5)#配置Nginx可以运行php

编译nginx.conf加入如下语句:
       location ~ \.php$ {
        root html;   
        fastcgi_pass 127.0.0.1:9000; 指定了fastcgi进程侦听的端口,nginx就是通过这里与php交互的
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME   /usr/local/nginx/html$fastcgi_script_name;
}
6)Nginx PHP 返回200,但是空白页

ngxin;php-fpm安装后,html静态页面没问题,但是phpinfo页面虽然返回200,但总是空白页

也没有任何报错,考虑应该是nginx已经将php页面转移给php处理了,所以问题应该在php的配置上,经过查找,发现需要在nginx中加入一句话
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

安装完nginx后默认的fastcgi_params配置文件中没有上面这句话。

在nginx.conf中的
        location ~ .php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
或者在fastcgi_params配置文件中加入
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

然后重启nginx就可以显示出页面了。

4.  Nginx详细配置

  nginx.conf配置文件的结构:

user www-data www-data;  使用的用户和组(可以只设置用户而已)
worker_processes 8;      #启动进程
error_log  logs/error.log;  #指定错误日志存放的路径
worker_rlimit_nofile 51200; #指定文件描述符数量

#工作模式及连接数上限
events {
     use epoll; #提高linux的io操作选项,Linux系统推荐采用epoll模型,FreeBSD系统推荐采用kequeue,linux下建议开启
     worker_connections      51200; #允许最大连接数,即单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定负载均衡的服务器列表
    upstream php_server_pool{
    }
    
    upstream message_server_pool{
       
    }
    #第一个虚拟主机,反向代理php_server_pool这组服务器
    server {   
	     #处理默认请求
        location /{
			root  /root;      #定义服务器的默认网站根目录位置    
            proxy_pass http://php_server_pool;
        }

    }
    
   #第二个虚拟主机,反向代理php_server_pool这组服务器
    server {
        listen 80;
        server_name www1.yourdomain.com;
        
        #访问http://www1.yourdomain.com/message/***地址,反向代理message_server_pool这组服务器
        location / {
            proxy_pass http://message_server_pool;
            proxy_set_header Host $host;
        }
        
        #访问除了/message/之外的http://www1.yourdomain.com/***,反向代理php_server_pool这组服务器
        location /message/
        {
            #DNS解析服务器的IP地址,可以在IE 工具-Internet选项-连接-局域网设置-代理服务器 中设置代理服务器IP地址和端口
            resolver 8.8.8.8;
            #该指令用于设置被代理服务器端口或套接字,以及URI
            proxy_pass http://php_server_pool;
            #该指令可以设置哪些从后端服务器传送过来的文件被Nginx存储。on保持文件与alias或root指令设置的目录一致,参数off不存储文件
            #proxy_store /data/www$original_uri;
            proxy_store on;
            #该指令用于指定创建文件和目录的权限
            proxy_store_access user:rw group:rw all:r;
            #指定一个本地目录来缓冲较大的代理请求
            proxy_temp_path /data/temp;
            #该指令用于在URL和文件系统路径之间实现映射。
            alias /data/www;
            #该指令允许重新定义或添加Header行道转发给被代理服务器的请求信息中,它的值可以是文本,也可以是变量,或者是文本和变量的组合。
            #使用$host变量,它的值相当于服务器的主机名(如果使用域名访问,则该值为域名;如果使用IP访问,则该值为IP)。此外可以将主机名和被代理服务器的端口一起传递  $host:$proxy_port
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            
        }
    }

} 




       
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.

#使用的用户和组(可以只设置用户而已)
user www-data www-data;
#启动进程,通常设置成和cpu的数量相等(一般等于CPU的总核数或者总核数的两倍),每个进程耗费10MB-12MB内存
worker_processes 8;
#指定错误日志存放的路径,错误日志记录级别可选项为:[debug | info | noticd | warn | error | crit]
error_log  logs/error.log;
#指定错误日志级别
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#指定pid存放的路径,文件内记录当前nginx主进程的ID,kill -HUP 'logs/nginx.pid'

#pid        logs/nginx.pid;

#指定文件描述符数量
worker_rlimit_nofile 51200; 

#工作模式及连接数上限
events {
     use epoll; #提高linux的io操作选项,Linux系统推荐采用epoll模型,FreeBSD系统推荐采用kequeue,linux下建议开启
     worker_connections      51200; #允许最大连接数,即单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #mimie.types 浏览器请求的文件媒体类型,类型由mime.type文件定义
    include       mime.types;
    #用来告诉浏览器请求的文件媒体类型
    default_type  application/octet-stream;
    #设置使用的字符集,如果一个网站有多种字符集,请不要随便设置,应该让程序员在HTML代码中通过Meta标签设置
    #charset gb2312;
    
    #日志记录格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    #日志名称,和日志记录格式采用main
    #access_log  logs/access.log  main;

   

     #设定请求缓冲

    #保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

    server_names_hash_bucket_size 128;

    #用于设置客户端请求的Header头缓冲区大小,大部分情况1KB大小足够。不能超过large_client_header_buffers缓冲区大小的设置
    client_header_buffer_size 32k;
    #该指令用于设置客户端请求的Header头缓冲区大小,默认值为4KB。
    large_client_header_buffers 4 32k;
    #设置客户端能够上传的文件大小,默认为1m
    client_max_body_size 8m;

    

   #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
   #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.

    sendfile on;
    #该指令允许或禁止使用FreeBSD上的TCP_NOPUSH,或者Linux上的TCP_CORK套接字选项。
    #tcp_nopush on;

    

    #连接超时时间

    #keepalive_timeout  0该指令可以使客户端到服务器端的连接持续有效
    keepalive_timeout 60;     #客户端到服务器端的连接持续有效时间为60
    #该指令允许或禁止使用套接字选项TCP_NODELAY,仅适用于keep-alive连接
    tcp_nodelay on;
    
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    #该指令用于设置upstream模块等待FastCGI进程发送数据的超时时间,默认值为60s;

    fastcgi_read_timeout 200;

     #设置FastCGI服务器相应头部的缓冲区

    #该指令设置FastCGI服务器相应头部的缓冲区大小。通常情况,该缓冲区大小设置等于fastcgi_buffers指令设置的一个缓冲区的大小。
    fastcgi_buffer_size 64k;
    #该指令设置了读取FastCGI进程返回信息的缓冲区数量和大小。
    fastcgi_buffers 4 64k;
    
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_writer_size 128k;
     #开启gzip压缩
    #开启gzip压缩,对网页文件、css、js、xml等启动gzip压缩,减少数据传输量,提高访问速度。
    gzip on;
    #该指令允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
    gzip_min_length 1k;
    #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。下面的设置代表16k为单位,按照原始数据大小以16k为单位的4倍申请内存。
    gzip_buffers 4 16k;
    #识别http的协议版本。
    gzip_http_version 1.1;
    #gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理速度最慢(传输快但比较消耗cpu)
    gzip_comp_level 2;
    #匹配mime类型进行压缩,无论是否指定,“text/html”类型总是会被压缩的。
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    #该指令定义了一个数据区,其中记录会话状态信息。  定义一个叫“crawler”的记录去,总容量为10MB,以变量$binary_remote_addr作为会话的判断基准(即一个地址一个会话)
    #limit_zone crawler $binary_remote_addr 10m;
    
    #允许客户端请求的最大单个文件字节数
    client_max_body_size 300m;
    

    #缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户

   如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

    client_body_buffer_size 128k;
    
    #跟后端服务器连接的超时时间_发起握手等候响应超时时间
    proxy_connect_timeout 600;
    
    #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
    proxy_read_timeout 600;
    
    #后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有的数据
    proxy_send_timeout 600;
    
    #代理请求缓存区_这个缓存区会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
    proxy_buffers 16k;
    
    #同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
    proxy_buffers 4 32k;
    
    #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
    proxy_busy_buffers_size 64k;
    
    #proxy缓存临时文件的大小
    proxy_temp_file_write_size 64k;
   

#nginx的缓存配置主要使用 proxy_cache模块实现,工作原理就是就用户请求缓存到本地的某个目录下,当再次请求时候,直接读取缓存,从而减轻服务器鸭梨

 

    #缓存    proxy_temp_path和proxy_cache_path必须在同一个分区
    proxy_temp_path /data2/proxy_temp_path;
    #该指令用于设置缓存文件的存放路径,设置缓存区名称为cache_one ,内存缓存空间大小为200M,自动清除超过1天没有被访问的缓存数据,硬盘缓存空间大小为30GB
    proxy_cache_path /data2/proxy_cache_path levels=1:2 keys_zone=cache_one:2000m inactive=1d max_size=30g;
    
    
    #include指令,使用此指令,可以包含任何你想要包含的配置文件,支持文件名匹配。
    #include vhosts/*.conf;
     #设定负载均衡的服务器列表
    upstream php_server_pool{
        #weight=NUMBER ——设置服务器的权重,权重数高被分配访问数越高,默认权重1.
        #max_fails=NUMBER——在参数fail_timeout指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接及发生服务器错误(404错误除外),则标记为失败。默认值为1.设置为0这关闭这项检查
        #fail_timeout=TIME——在经历参数max_fails设置的失败次数后,暂停的时间
        #down——标记服务器为永久离线状态,用于ip_hash指令
        #backup——仅仅在非backup服务器全部繁忙的时候才启动
        
        #upstream模块拥有以下变量:
        #    $upstream_addr:处理请求的upstream服务器地址
        #    $upstream_status:upstream服务器的应答状态
        #    $upstream_response_time:Upstream服务器响应时间(毫秒),多个响应以逗号和冒号分隔。
        #    $upstream_http_$HEADER:任意的HTTP协议头信息,例如:$upstream_http_host
        
        server 192.168.1.10:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.11:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.12:80 weight=1 max_fails=2 fail_timeout=30s;
    }
    
    upstream message_server_pool{
        #ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器。但无法保证后端服务器的负载均衡,所以建议后端服务器能做到session共享来代替nginx的ip_hash方式。
        #且如果后端服务器有时要从Nginx负载均衡中摘除一段时间,你必须将其标记为“down”
        #ip_hash;
        server 192.168.1.13:3245;
        server 192.168.1.14:3245 down;
    }
    
    upstream bbs_server_pool{
        server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s;
    }
    
    #第一个虚拟主机,反向代理php_server_pool这组服务器
    server
    {
        #该指令用于设置虚拟主机监听的服务器地址和端口号。
        #listen127.0.0.1:8080;
        #listen 8000;
        #listen *:8000;
        #listen localhost:8000;

        listen 80;

#定义使用访问域名

        server_name www.yourdomain.com;
        
        #SSL加密浏览
        ssl on
        ssl_certificate www.yourdomain.com.crt;
        ssl_certificate_key www.yourdomain.com.key;

         

        #默认请求

        location /

        {

root   /root;      #定义服务器的默认网站根目录位置    

            #限制下载速度256KB/秒
            limit_rate 256k;
            #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
            proxy_next_upstream http_502  http_504 error timeout invalid_header;
            proxy_pass http://php_server_pool;
            proxy_set_header Host www.yourdomain.com;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        #设定本虚拟主机的访问日志

         access_log /data1/logs/www.yourdomain.com_access.log;        

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

    }
    
    #第二个虚拟主机,反向代理php_server_pool这组服务器
    server
    {
        listen 80;
        server_name www1.yourdomain.com;
        
        #访问http://www1.yourdomain.com/message/***地址,反向代理message_server_pool这组服务器
        location /
        {
            proxy_pass http://message_server_pool;
            proxy_set_header Host $host;
        }
        
        #访问除了/message/之外的http://www1.yourdomain.com/***,反向代理php_server_pool这组服务器
        location /message/
        {
            #DNS解析服务器的IP地址,可以在IE 工具-Internet选项-连接-局域网设置-代理服务器 中设置代理服务器IP地址和端口
            resolver 8.8.8.8;
            #该指令用于设置被代理服务器端口或套接字,以及URI
            proxy_pass http://php_server_pool;
            #该指令可以设置哪些从后端服务器传送过来的文件被Nginx存储。on保持文件与alias或root指令设置的目录一致,参数off不存储文件
            #proxy_store /data/www$original_uri;
            proxy_store on;
            #该指令用于指定创建文件和目录的权限
            proxy_store_access user:rw group:rw all:r;
            #指定一个本地目录来缓冲较大的代理请求
            proxy_temp_path /data/temp;
            #该指令用于在URL和文件系统路径之间实现映射。
            alias /data/www;
            #该指令允许重新定义或添加Header行道转发给被代理服务器的请求信息中,它的值可以是文本,也可以是变量,或者是文本和变量的组合。
            #使用$host变量,它的值相当于服务器的主机名(如果使用域名访问,则该值为域名;如果使用IP访问,则该值为IP)。此外可以将主机名和被代理服务器的端口一起传递  $host:$proxy_port
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            
        }
        
        access_log /data1/logs/www.yourdomain.com_access.log;        
    }
    
    #第三个虚拟主机
    server
    {
        listen 80;
        server_name bbs.yourdomain.com *.bbs.yourdomain.com;
            
        location /
        {
            proxy_pass http://bbs_server_pool;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            #禁止指定的IP地址或者IP段访问某些虚拟主机或目录
            #deny 192.168.1.1/24;
            #允许指定的IP地址或者IP段访问某些虚拟主机或目录
            #allow 192.168.1.0/24;
            
        }
        
        #不记录日志
        access_log off;        
    }                 
    #静态文件,nginx自己处理
    location ~ ^/(images|javascript|js|css|flash|media|static)/ {
        root /var/www/virtual/htdocs;
        #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
        expires 30d;

    }

   #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
    location ~ \.php$ {
        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;
    }

     #设定查看Nginx状态的地址
    location /NginxStatus {
        stub_status            on;
        access_log              on;
        auth_basic              "NginxStatus";
        auth_basic_user_file  conf/htpasswd;
    }
    #禁止访问 .htxxx 文件
    location ~ /\.ht {
        deny all;
    }

}

以上是一些基本的配置,使用Nginx最大的好处就是负载均衡

 

4.   补充说明

1)下

1 ) use epoll;  

与apache相类,nginx针对不同的操作系统,有不同的事件模型

A)标准事件模型

Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

B)高效事件模型

Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

Epoll:使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

Eventport:使用于Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装安全补丁

2)

og_format main '$host $status [$time_local] $remote_addr [$time_local] $request_uri '

'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" '

'$bytes_sent $request_time $sent_http_x_cache_hit';

log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

$remote_user:用来记录客户端用户名称;

$time_local: 用来记录访问时间与时区;

$request: 用来记录请求的url与http协议;

$status: 用来记录请求状态;成功是200,

$body_bytes_s ent :记录发送给客户端文件主体内容大小;

$http_referer:用来记录从那个页面链接访问过来的;

$http_user_agent:记录客户毒啊浏览器的相关信息;

通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址;

3)nginx的upstream负载均衡模块目前支持4种方式的分配

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}

4、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

tips:

upstream bakend{#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;

每个设备的状态设置为:
1.down表示单前的server暂时不参与负载
2.weight默认为1.weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path设置记录文件的目录 可以设置最多3层目录

location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡


4 )注释:变量

Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。

首先是说明客户请求title中的行,例如$http_user_agent,$http_cookie等等。

此外还有其它的一些变量

$args此变量与请求行中的参数相等

$content_length等于请求行的“Content_Length”的值。

$content_type等同与请求头部的”Content_Type”的值

$document_root等同于当前请求的root指令指定的值

$document_uri与$uri一样

$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样

$limit_rate允许限制的连接速率

$request_method等同于request的method,通常是“GET”或“POST”

$remote_addr客户端ip

$remote_port客户端port

$remote_user等同于用户名,由ngx_http_auth_basic_module认证

$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成

$request_body_file

$request_uri含有参数的完整的初始URI

$query_string与$args一样

$sheeme http模式(http,https)尽在要求是评估例如

Rewrite ^(.+)$ $sheme://example.com$; Redirect;

$server_protocol等同于request的协议,使用“HTTP/或“HTTP/

$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。

$server_name请求到达的服务器名

$server_port请求到达的服务器的端口号

$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

作者:hguisu 发表于2013-3-5 21:05:46 原文链接
阅读:44 评论:0 查看评论

相关 [nginx] 推荐:

nginx配置ssl

- - 邢红瑞的blog

Nginx GZip 压缩

- - 开心平淡对待每一天。热爱生活
  Nginx GZip 模块文档详见: http://wiki.nginx.org/HttpGzipModule 常用配置片段如下:. text/css text/javascript; # 哪些文件可以被压缩 gzip_disable. 其中 gzip_types 选项默认只压缩 text/html,源码见:. src/http/modules/ngx_http_gzip_filter_module.c 行152:. &ngx_http_html_default_types[0] src/http/ngx_http.c 行77:. OK,到这里基本服务端已经配置完毕,Nginx 只需要 reload 一下即可.

Nginx安装

- - 企业架构 - ITeye博客
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩. ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:. http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:. Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /usr/local/nginx 目录下的详细步骤:.

NGINX的流媒体插件 nginx-rtmp-module

- - 开源软件 - ITeye博客
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能. HLS (HTTP Live Streaming) M3U8的支持. ./configure --add-module=<这货的路径>. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

nginx日志切割

- - haohtml's blog
如果你不处理,日志文件将变得越来越大,还好我们可以写一个nginx日志切割脚本来自动切割日志文件. 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志. 在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件. nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者. 重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件. #nginx日志切割脚本 #author: http://www.nginx.cn #!/bin/bash #设置日志文件存放目录 logs_path="/usr/local/nginx/logs/" #设置pid文件 pid_path="/usr/local/nginx/nginx.pid" #重命名日志文件 mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log #向nginx主进程发信号重新打开日志 kill -USR1 `cat ${pid_path}`.

nginx + keepalive 实现HA

- - CSDN博客编程语言推荐文章
主nginx负载均衡器 192.168.166.203. 辅nginx负载均衡器 192.168.166.177. 二.修改配置文件为以下内容: [master slave].  state MASTER #(主机为MASTER,备用机为BACKUP).  virtual_router_id 61 #(主、备机的virtual_router_id必须相同).  #mcast_src_ip 192.168.166.203 #(多播的源IP,设置为本机外网IP,与VIP同一网卡)此项可不设置.  priority 90 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高).  advert_int 1 #(VRRP Multicast广播周期秒数).

Nginx模块开发入门

- ripwu - 博客园-EricZhang&#39;s Technology Blog
Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%. 与Apache相比,Nginx在高并发情况下具有巨大的性能优势. Nginx属于典型的微内核设计,其内核非常简洁和优雅,同时具有非常高的可扩展性. Nginx最初仅仅主要被用于做反向代理,后来随着HTTP核心的成熟和各种HTTP扩展模块的丰富,Nginx越来越多被用来取代Apache而单独承担HTTP Server的责任,例如目前淘宝内各个部门正越来越多使用Nginx取代Apache,据笔者了解,在腾讯和新浪等公司也存在类似情况. 例如,由淘宝的工程师清无(王晓哲)和春来(章亦春)所开发的nginx_lua_module可以将Lua语言嵌入到Nginx配置中,从而利用Lua极大增强了Nginx本身的编程能力,甚至可以不用配合其它脚本语言(如PHP或Python等),只靠Nginx本身就可以实现复杂业务的处理.

nginx cronolog日志分割

- 伟伟 - 高进波博客 - 零起点一步配置你的linux服务器,linux博客,linux教程,web架构 [expanded by feedex.net]
八月 3rd, 2011 Posted in Nginx | 阅读次数: 8 次. nginx cronolog日志分割配置文档,根据下面方法,每小时分割一次NGINX访问日志. cronolog必须在nginx启动前启动,如果是ubuntu,可以将cronolog配置那行写到/etc/init.d/nginx start函数那. 非常好的nginx图书推荐Nginx_HTTP_Server_2010. ubuntu10.04下安装配置php+nginx+mysql. nginx无法完整下载文件 dx1.5附件不能下载 解决方法. nginx 0day解决方法 解决Nginx文件类型错误解析漏洞的方法.

Nginx模块开发入门

- 圣斌 - CodingLabs
Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%. 与Apache相比,Nginx在高并发情况下具有巨大的性能优势. Nginx属于典型的微内核设计,其内核非常简洁和优雅,同时具有非常高的可扩展性. Nginx最初仅仅主要被用于做反向代理,后来随着HTTP核心的成熟和各种HTTP扩展模块的丰富,Nginx越来越多被用来取代Apache而单独承担HTTP Server的责任,例如目前淘宝内各个部门正越来越多使用Nginx取代Apache,据笔者了解,在腾讯和新浪等公司也存在类似情况. 例如,由淘宝的工程师清无(王晓哲)和春来(章亦春)所开发的nginx_lua_module可以将Lua语言嵌入到Nginx配置中,从而利用Lua极大增强了Nginx本身的编程能力,甚至可以不用配合其它脚本语言(如PHP或Python等),只靠Nginx本身就可以实现复杂业务的处理.

Nginx+uWSGI 部署 Django 应用

- Ken - python.cn(jobs, news)
常见的django webapp 部署方式采用FCGI 或 WSGI的方式部署,今天我这备忘下采用uWSGI的部署方式. 目前我这博客就是采用 Nginx + uWSGI + Python + Django 构建的,部署虽没有php那样扔到目录那么方便,但是并发和性能消耗还是非常不错的. 这里不想赘述关于FCGI, WSGI,uWSGI之间的比较,网上关于这样的对比测试也有很多,例如这里. uWSGI 的官方网站 http://projects.unbit.it/uwsgi/ wiki介绍的很详细. Nginx关于HttpUwsgiModule的介绍http://wiki.nginx.org/HttpUwsgiModule.有这些资料参考,安装部署是很容易的事情.