#运行用户  
user nobody;  
#启动进程,通常设置成和cpu的数量相等  
worker_processes  1;  
  
#全局错误日志及PID文件  
#error_log  logs/error.log;  
#error_log  logs/error.log  notice;  
#error_log  logs/error.log  info;  
  
#pid        logs/nginx.pid;  
  
#工作模式及连接数上限  
events {  
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,  
    #仅用于linux2.6以上内核,可以大大提高nginx的性能  
    use   epoll;   
  
    #单个后台worker process进程的最大并发链接数      
    worker_connections  1024;  
  
    # 并发总数是 worker_processes 和 worker_connections 的乘积  
    # 即 max_clients = worker_processes * worker_connections  
    # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么  
    # 为什么上面反向代理要除以4,应该说是一个经验值  
    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000  
    # worker_connections 值的设置跟物理内存大小有关  
    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数  
    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右  
    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:  
    # $ cat /proc/sys/fs/file-max  
    # 输出 34336  
    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内  
    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置  
    # 使得并发总数小于操作系统可以打开的最大文件数目  
    # 其实质也就是根据主机的物理CPU和内存进行配置  
    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。  
    # ulimit -SHn 65535  
  
}  
  
  
http {  
    #设定mime类型,类型由mime.type文件定义  
    include    mime.types;  
    default_type  application/octet-stream;  
    #设定日志格式  
    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  logs/access.log  main;  
  
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,  
    #对于普通应用,必须设为 on,  
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,  
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.  
    sendfile     on;  
    #tcp_nopush     on;  
  
    #连接超时时间  
    #keepalive_timeout  0;  
    keepalive_timeout  65;  
    tcp_nodelay     on;  
  
    #开启gzip压缩  
    gzip  on;  
    gzip_disable "MSIE [1-6].";  
  
    #设定请求缓冲  
    client_header_buffer_size    128k;  
    large_client_header_buffers  4 128k;  
  
  
    #设定虚拟主机配置  
    server {  
        #侦听80端口  
        listen    80;  
        #定义使用 www.nginx.cn访问, 转发到哪个地址
        server_name  www.nginx.cn;  
  
        #定义服务器的默认网站根目录位置  
        root html;  
  
        #设定本虚拟主机的访问日志  
        access_log  logs/nginx.access.log  main;  
  
        #默认请求  
        location / {  
  
            #定义首页索引文件的名称  
            index index.php index.html index.htm;     
  
        }  
  
        # 定义错误提示页面  
        error_page   500 502 503 504 /50x.html;  
        location = /50x.html {  
        }  
  
        #静态文件,nginx自己处理  
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {  
  
            #过期30天,静态文件不怎么更新,过期可以设大一点,  
            #如果频繁更新,则可以设置得小一点。  
            expires 30d;  
        }  
  
        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.  
        location ~ .php$ {  
            fastcgi_pass 127.0.0.1:9000;  
            fastcgi_index index.php;  
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;  
            include fastcgi_params;  
        }  
  
        #禁止访问 .htxxx 文件  
            location ~ /.ht {  
            deny all;  
        }  
  
    }  
}  

总结:

1、server下的结点:

listen:监听80端口

server_name:转发到哪个地址

proxy_pass:代理到哪个地址

2、nginx常用命令(要进入到nginx的目录):

开启:start nginx

重启:nginx -s reload

==============================================================================================================

#nginx进程,一般设置为和cpu核数一样
worker_processes 4;                        
#错误日志存放目录 
error_log  /data1/logs/error.log  crit;  
#运行用户,默认即是nginx,可不设置
user nginx       
#进程pid存放位置
pid        /application/nginx/nginx.pid;        

#Specifies the value for maximum file descriptors that can be opened by this process. 
#最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果
worker_rlimit_nofile 51200;

cpu亲和力配置,让不同的进程使用不同的cpu

worker_cpu_affinity 0001 0010 0100 1000 0001 00100100 1000;

#工作模式及连接数上限
events 
{
  use epoll;       #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
  worker_connections 1024;  #;单个后台worker process进程的最大并发链接数
}
###################################################
http 
{

include mime.types; #文件扩展名与类型映射表
default_type application/octet-stream; #默认文件类型

#limit模块,可防范一定量的DDOS攻击
#用来存储session会话的状态,如下是为session分配一个名为one的10M的内存存储区,限制了每秒只接受一个ip的一次请求 1r/s
  limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  limit_conn_zone $binary_remote_addr zone=addr:10m;
  include       mime.types;
  default_type  application/octet-stream;

#第三方模块lua防火墙
    lua_need_request_body on;
    #lua_shared_dict limit 50m;
    lua_package_path "/application/nginx/conf/waf/?.lua";
    init_by_lua_file "/application/nginx/conf/waf/init.lua";
    access_by_lua_file "/application/nginx/conf/waf/access.lua";

 #设定请求缓存    
  server_names_hash_bucket_size 128;
  client_header_buffer_size 512k;
  large_client_header_buffers 4 512k;
  client_max_body_size 100m;


  #隐藏响应header和错误通知中的版本号
  server_tokens off;
  #开启高效传输模式   
  sendfile on;

-------------------------------------------------------------------------------------------------
  #激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,
  积极的作用是减少网络报文段的数量
  tcp_nopush     on;
  #激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能
  tcp_nodelay on;

tcp_nopush

 

官方:

tcp_nopush

Syntax: tcp_nopush on | off

Default: off

Context: http

server

location

Reference: tcp_nopush

This directive permits or forbids the use of thesocket options TCP_NOPUSH on FreeBSD or TCP_CORK on Linux. This option is onlyavailable when using sendfile.

Setting this option causes nginx to attempt to sendit’s HTTP response headers in one packet on Linux and FreeBSD 4.x

You can read more about the TCP_NOPUSH and TCP_CORKsocket options here.

linux 下是tcp_cork,上面的意思就是说,当使用sendfile函数时,tcp_nopush才起作用,它和指令tcp_nodelay是互斥的。tcp_cork是linux下tcp/ip传输的一个标准了,这个标准的大概的意思是,一般情况下,在tcp交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而tcp_cork选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞,已经是默认了。

也就是说tcp_nopush = on 会设置调用tcp_cork方法,这个也是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。

以快递投递举例说明一下(以下是我的理解,也许是不正确的),当快递东西时,快递员收到一个包裹,马上投递,这样保证了即时性,但是会耗费大量的人力物力,在网络上表现就是会引起网络堵塞,而当快递收到一个包裹,把包裹放到集散地,等一定数量后统一投递,这样就是tcp_cork的选项干的事情,这样的话,会最大化的利用网络资源,虽然有一点点延迟。

对于nginx配置文件中的tcp_nopush,默认就是tcp_nopush,不需要特别指定,这个选项对于www,ftp等大文件很有帮助
View Code

相关文章: