当前位置: 澳门新濠3559 > 操作系统 > 正文

比如进程数、运行的身份、PID存放目录等都在m

时间:2019-11-08 15:11来源:操作系统
main全局配置 nginx在运行时与具体业务功能(比如http服务或者emain服务代理)无关的一些参数,比如进程数、运行的身份、PID存放目录等都在main区域设置。 user www www;worker_processes 4;work

main全局配置

nginx在运行时与具体业务功能(比如http服务或者emain服务代理)无关的一些参数,比如进程数、运行的身份、PID存放目录等都在main区域设置。

user www www;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
error_log  /data/logs/nginx_error.log crit;
pid  /usr/local/webserver/nginx/nginx.pid;
worker_rlimit_nofile 65535;
  • user 指定nginx进程使用什么用户和用户组启动
  • worker_processes指定启动多少个进程处理请求。一般情况下设置为CPU核数。如果开启了ssh和gzip应该设置为CPU颗数的2倍,这样可以减少I/O操作
  • worker_cpu_affinity在高并发情况下,通过将CPU和具体进程绑定,可以降低多核CPU切换造成寄存器性能损耗
  • error_log用来定义全局错误日志文件
  • pid指定pid文件位置
  • worker_rlimit_nofile用于指定一个nginx进程最多可以打开的文件描述符数目

【nginx】配置文件的优化

1、编译安装过程优化

 

在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节。在编译前取消Nginx的debug模式,编译完成后Nginx只有几百千字节,因此可以在编译之前,修改相关源码,取消debug模式,具体方法如下:

 

在Nginx源码文件被解压后,找到源码目录下的auto/cc/gcc文件,修改如下几行

 

sed -i '[email protected]="$CFLAGS -g"@#CFLAGS="$CFLAGS -g"@' auto/cc/gcc

为特定的CPU指定CPU类型编译优化

 

在编译Nginx时,默认的GCC编译参数是“-O”,要优化GCC编译,可以使用以下两个参数:

 

--with-cc-opt='-O3'

--with-cpu-opt=CPU  #为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

 

要确定CPU类型,可以通过如下命令:

 

cat /proc/cpuinfo | grep "model name"

 

nginx配置参数

 

--prefix=/usr/local/nginx 
--error-log-path=/data/logs/error/error.log 
--http-log-path=/data/logs/access/access.log 
--pid-path=/var/run/nginx/nginx.pid  
--lock-path=/var/lock/nginx.lock    
--conf-path=/etc/nginx/nginx.conf 
--sbin-path=/usr/sbin/nginx 
--user=www 
--group=webgrp 
--vhost-domain=example.com 
--pro-language=php 
--with-http_ssl_module 
--with-http_realip_module 
--with-http_addition_module 
--with-http_image_filter_module 
--with-http_sub_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_mp4_module 
--with-http_gzip_static_module 
--with-http_concat_module 
--with-http_random_index_module 
--with-http_secure_link_module 
--with-http_degradation_module 
--with-http_sysguard_module 
--with-backtrace_module 
--with-http_stub_status_module 
--with-http_upstream_check_module 
--with-google_perftools_module 
--with-http_geoip_module
--with-pcre=/usr/local/src/pcre-8.35 
--with-http_image_filter_module

 

2、隐藏版本号

 

在nginx配置文件的http标签内加入“server_tokens off; ”参数,也可以放大server标签和location标签中

 

或者在源代码中更改

 

src/core/nginx.h

 

#define NGINX_VERSION  "1.6.2" // 修改为想要的版本号如2.4.3

#define NGINX_VER "nginx/" 改为 Apache

src/http/ngx_http_header_filter_module.c

 

 

static char ngx_http_server_string[] ="Server:nginx"  //改为apache  

src/http/ngx_http_special_response.c

 

static u_char ngx_http_error_full_tail[] =
"<hr><center>" NGINX_VER "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;


static u_char ngx_http_error_tail[] =
"<hr><center>nginx</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;   
//改为apache

 

 

3、利用TCMalloc优化Nginx的性能

 

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。

 

要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程:

 

centos 》 nginx 》gperftools》libunwind 依赖顺序, 先安装libunwind

 

cd /usr/local/src

wget  -c http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz >libunwind-1.1.tar.gz
tar zxf libunwind-1.1.tar.gz
cd libunwind-1.1

CFLAGS=-fPIC ./configure --prefix=/usr --enable-shared
make CFLAGS=-fPIC
make CFLAGS=-fPIC install

 

安装google-perftools

 

cd /usr/local/src

wget -c ftp://ftp.tw.freebsd.org/pub/ports/distfiles/gperftools-2.1.tar.gz
#wget -c http://gperftools.googlecode.com/files/google-perftools-2.1.tar.gz(现在googlecode.com被封了)

tar -vxzf gperftools-2.1.tar.gz
cd gperftools-2.1

./configure 
--prefix=/usr/local/gperftools 
--disable-cpu-profiler 
--enable-shared 
--disable-heap-profiler 
--disable-heap-checker 
--disable-dependency-tracking 
--enable-frame-pointers

or

./configure --prefix=/usr/local/gperftools  --enable-frame-pointers

make && make install

 

 

到这里安装google-perftools完成了但未生效,接下来需要使google-perftools生效

 

/sbin/ldconfig

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

ldconfig

  

or

ln -s /usr/local/gperftools/lib/* /usr/local/lib

ldconfig

 

 

nginx配置文件修改 

 

google_perftools_profiles /data/www/tmp/tcmalloc;

 

验证运行状态

 

[[email protected] http]# lsof -n | grep tcmalloc

nginx     18292       www   13w      REG                8,2          0     660107 /data/www/tmp/tcmalloc.18292

nginx     18293       www   15w      REG                8,2          0     660109 /data/www/tmp/tcmalloc.18293

nginx     18294       www   23w      REG                8,2          0     660108 /data/www/tmp/tcmalloc.18294

nginx     18295       www   25w      REG                8,2          0     660110 /data/www/tmp/tcmalloc.18295

nginx     18296       www   30w      REG                8,2          0     660106 /data/www/tmp/tcmalloc.18296

 

4、配置文件优化

 

nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)

 

worker_processes 8;

 

为每个进程分配cpu,上例中将8 个进程分配到8 个cpu,当然可以写多个,或者将一个进程分配到多个cpu

 

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;//8颗cpu

worker_cpu_affinity  0001 0010 0100 1000; //4颗cpu

 

这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致,可以限制为操作系统最大的限制65535

 

worker_rlimit_nofile 65535;

 

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小,但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数

 

[[email protected] http]# getconf PAGESIZE

4096

 

client_header_buffer_size 4k;

 

这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。

 

open_file_cache max=65535 inactive=60s;

 

这个是指多长时间检查一次缓存的有效信息

 

open_file_cache_valid 80s;

 

open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。

 

open_file_cache_min_uses 1;

 

开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载

 

sendfile on

tcp_nopush on //只有在sendfile开启模式下有效

 

长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

 

keepalive_timeout 60;#设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。

 

tcp_nodelay on;#打开tcp_nodelay,在包含了keepalive参数才有效

client_header_timeout 15;#设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误

client_body_timeout 15;#设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误

send_timeout 15;#指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

 

允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值

 

client_max_body_size 10m

 

缓冲区代理缓冲用户端请求的最大字节数

 

client_body_buffer_size 128k

 

事件处理模型优化,根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];

 

events {

    use epoll;

    worker_connections 65536;

}

Max_client=worker_processes*worker_connections

 

fastcgi配置

 

fastcgi_connect_timeout 300;#指定链接到后端FastCGI的超时时间。

 

fastcgi_send_timeout 300;#向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。

 

fastcgi_read_timeout 300;#指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

 

fastcgi_buffer_size 64k;#指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为gastcgi_buffers选项指定的缓冲区大小。

 

fastcgi_buffers 4 64k;#指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 16K”、“4 64k”等。

 

fastcgi_busy_buffers_size 128k;#建议设置为fastcgi_buffer的两倍,繁忙时候的buffer

 

fastcgi_temp_file_write_size 128k;#在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报502 Bad Gateway

 

fastcgi_cache oldboy_ngnix;#表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误放生,但是开启缓存也可能会引起其他问题,要很据具体情况选择

 

fastcgi_cache_valid 200 302 1h;#用来指定应答代码的缓存时间,实例中的值表示将2000和302应答缓存一小时,要和fastcgi_cache配合使用

fastcgi_cache_valid 301 1d;#将301应答缓存一天

fastcgi_cache_valid any 1m;#将其他应答缓存为1分钟

fastcgi_cache_min_uses 1;#请求的数量

fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m;#定义缓存的路径

 

gzip配置

 

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压缩的数据。

expires配置

 

对于图片,CSS,JS等元素更改的机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,CSS,JS,html等代码缓存10天,这样用户第一次打开页面后,会在本地缓存上述内容,提高了以后打开的页面加载速度,节省服务端大量贷款,此功能同apache的expires。这里通过location,将需要缓存的扩展名列出来,然后指定缓存时间

 

location ~* .(ico|jpe?g|gif|png|bmp|swf|flv)(?[0-9]+)?$ {
    expires 30d;
    log_not_found off;
    access_log off;
}

location ~* .(js|css)$ {
    expires 7d;
    log_not_found off;
    access_log off;
}  

location = /(favicon.ico|roboots.txt) {
    access_log off;
    log_not_found off;
}

 

URL访问控制

 

来就应该只是资源文件,禁止指定扩展名程序被执行,例如:.php,.sh,.pl,nginx下禁止访问资源目录下的php程序文件

 

location ~ ^/images/.*.(php|php5|.sh|.pl|.py)$
{
    deny all;
}

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444;
}

location ~ ^/static/.*.(php|php5|.sh|.pl|.py)$
{
    deny all;
}

location ~* ^/data/(attachment|avatar)/.*.(php|php5)$
{
    deny all;
}

 

 

限制使用网站ip访问网站

 

server {

    listen 80 default_server;

    server_name _;

    return 444;

}

 

图片及目录防盗链

 

location ~* .(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {

    valid_referers none blocked *.etiantian.org etiantian.org;

    if ($invalid_referer) {

        return 302  ;

    }

}

 

优雅的错误提示

 

error_page   500 501 502 503 504  ;

error_page 400 403 404 405 408 410 411 412 413 414 415 ;

 

爬虫优化,可以进行适当限速

 

使用tmpfs文件系统给/tmp

 

提高效率,部分程序切图片操作临时放到/tmp下,可以把tmp设置成内存文件系统,占用内存空间的,就是从内存里拿出一块来当磁盘用

 

mount -t tmpfs  -o size=16m tmpfs /tmp

 

防DOS攻击

 

限制单个ip的 req/s , conn

 

map $remote_addr $rt_filtered_ip {
        default $binary_remote_addr;
        1.2.3.4 "";
        4.4.4.4 "";
}

or

geo $rt_filtered_ip {
    default        $binary_remote_addr;

    127.0.0.1      "";
    192.168.1.0/24 "";
    10.1.0.0/16    "";

    ::1            "";
    2001:0db8::/32 "";

    1.2.3.4        ""
}

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_conn_zone $host$uri zone=peruri:10m;
limit_req_zone $rt_filtered_ip zone=qps:10m rate=1r/s;

server {


        location = /wp-login.php {
            limit_req zone=qps burst=5 nodelay;
            limit_conn perip 10;
            limit_conn perserver 100;
            limit_rate 500k;
            include fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
        }
}

ab -n 100 -c 10 example.com/wp-login.php

 

$binary_remote_addr是限制同一客户端ip地址;

$server_name是限制同一server最大并发数;

limit_conn为限制并发连接数;

limit_rate为限制下载速度;

访问控制 allow/deny

 

location /nginx-status {

    stub_status on;

    access_log off;

    auth_basic   "NginxStatus";

    auth_basic_user_file   /usr/local/nginx/htpasswd;

 

    allow 192.168.10.100;

    allow 172.29.73.0/24;

    deny all;

} //htpasswd -c htpasswd admin

 

5、一个标准的配置文件

nginx.conf配置

 

user  www  webgrp;

worker_processes  4;
worker_cpu_affinity  0001 0010 0100 1000;
worker_rlimit_nofile    65536;

pid     /var/run/nginx.pid;
#error_log  /data/logs/error/nginx_error.log  info;
google_perftools_profiles /data/www/tmp/tcmalloc;

events
{
    use epoll;
    worker_connections  65536;
}

http
{
    include mime.types;
    default_type    application/octet-stream;
    charset  utf-8;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 32k;
    client_max_body_size 32m;

    open_file_cache max=65536 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;

    sendfile on;
    tcp_nopush on;
    keepalive_timeout 60;
    tcp_nodelay on;
    server_tokens off;
    port_in_redirect off;

    fastcgi_connect_timeout 600;
    fastcgi_send_timeout 600;
    fastcgi_read_timeout 600;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_temp_path /dev/shm/nginx_tmp;
    fastcgi_intercept_errors on;   
    #fastcgi_cache_path /data/www/tmp/_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=10g;

    #open gzip
    gzip on;
    gzip_vary on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 4;
    gzip_proxied any;
    gzip_types  text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;   
    gzip_disable "MSIE [1-6].(?!.*SV1)";

    #Proxy
    proxy_connect_timeout   600;
    proxy_read_timeout  600;
    proxy_send_timeout  600;
    proxy_buffer_size   16k;
    proxy_buffers   4   32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size  64k;
    proxy_cache_path /data/www/tmp/cache levels=1:2 keys_zone=Z:100m inactive=7d max_size=30g;

    #Limit
    limit_req_zone $binary_remote_addr  zone=xxx:10m rate=5r/s;
    limit_req_zone $binary_remote_addr  zone=qps1:1m rate=1r/s;


    #Log format

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
          '"$http_user_agent"  $http_x_forwarded_for  $request_body'
                  'upstream_response_time $upstream_response_time request_time $request_time';

    #502_next
        upstream php_fpm_sock{
            server unix:/dev/shm/php-fpm.socket;
            server unix:/dev/shm/php-fpm-b.socket;
            server unix:/dev/shm/php-fpm-c.socket;
        }

        fastcgi_next_upstream error timeout invalid_header http_503  http_500;

    #cros
    add_header Access-Control-Allow-Origin *; 
    #add_header X-Cache-CFC "$upstream_cache_status - $upstream_response_time";

    server
    {
        listen 80 default;
        server_name _;
        return 444;
    }

    include vhosts/*.conf;
}

 

vhost配置

 

server {
    listen 80;
    server_name www.example.com example.com;
    root /data/www/www.example.com/;
    index  index.php index.html index.htm;
    access_log /data/logs/access/www.example.com_access.log access;
    error_log /data/logs/error/www.example.com_error.log crit;

    location @fobidden{
        include fastcgi_params;
        fastcgi_pass unix:php_fpm_sock;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        allow 124.112.113.242;
        deny all;
    }

    location /nginx_status {
            stub_status on;
            access_log   off;
        allow 124.112.113.242;
            deny all;
        }

    location = /status {
        try_files $uri $uri/ @fobidden;
    }

    if ($host = example.com ) {
        return 301 $scheme://www.example.com$request_uri;
    }

    location ~ /bbs/ {
        if ($host = www.example.com ) {
            rewrite ^/bbs/(.*)$ $scheme://bbs.example.com/$1 permanent;
            break;
        }
    }

    location = /application/ {
        return 302 /application/uploads/other/404-3.jpg;
    }

    location / {
        try_files $uri $uri/ /application.php?s=$uri&$args;
    }

    location ~* .php($|/){
        set $script     $uri;
        set $path_info  "";
        if ($uri ~ "^(.+?.php)(/.+)$") {
            set $script     $1;
            set $path_info  $2;
        }
        fastcgi_pass unix:php_fpm_sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$script;
        fastcgi_param  SCRIPT_NAME $script;
        fastcgi_param  PATH_INFO $path_info;
        include fastcgi.conf;
        include fastcgi_params;

        #fastcgi_cache ngx_fcgi_cache;
        #fastcgi_cache_valid 200 302 1h;
        #fastcgi_cache_valid 301 1d;
        #fastcgi_cache_valid any 1m;
        #fastcgi_cache_min_uses 1;
        #fastcgi_cache_use_stale error timeout invalid_header http_500;
        #fastcgi_cache_key $scheme://$host$request_uri;

    }

    location ~* .(ico|jpe?g|gif|png|bmp|swf|flv)(?[0-9]+)?$ {

        expires 30d;
        log_not_found off;
        access_log off;
    }

    location ~* .(js|css)$ {
        expires 7d;
        log_not_found off;
        access_log off;
    }  

    location = /(favicon.ico|roboots.txt) {
        access_log off;
        log_not_found off;
    }

    location ~* .(htacess|svn|tar.gz|tar|zip|sql) {
        return 404;
    }


    #location ~* .(gif|jpg|png|swf|flv)$ {
    #   valid_referers none blocked www.example.com example.com
    #   if ($invalid_referer) {
    #       return 404;
    #   }
    #} 

    error_page 404 500 502 /Common/tpl/404.html;
} 

 

6、系统内核的优化

sysctl.conf 中一部分配置

 

net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30

 

下面是对实例中选项的含义进行介绍:

 

net.ipv4.tcp_max_tw_buckets参数用来设定timewait的数量,默认是180000,这里设为6000。

 

net.ipv4.ip_local_port_range选项用来设定允许系统打开的端口范围。

 

net.ipv4.tcp_tw_recycle选项用于设置启用timewait快速回收。

 

net.ipv4.tcp_tw_reuse选项用于设置开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。

 

net.ipv4.tcp_syncookies选项用于设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理。

 

net.core.somaxconn选项默认值是128, 这个参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此,需要结合并发请求数来调节此值。

 

net.core.netdev_max_backlog选项表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。

 

net.ipv4.tcp_max_orphans选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至人为减小这个值,更多的情况是增加这个值。

 

net.ipv4.tcp_max_syn_backlog选项用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,此参数的默认值是1024,对小内存的系统则是128。

 

net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。

 

net.ipv4.tcp_syn_retries选项表示在内核放弃建立连接之前发送SYN包的数量。

 

net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。正确设置这个值非常重要,有时候即使一个负载很小的Web服务器,也会出现因为大量的死套接字而产生内存溢出的风险。

 

net.ipv4.tcp_keepalive_time选项表示当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

 

 

修改系统最大连接数 /etc/security/limits.conf  

 

 

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535 //ulimit -SHn 65535

 

1、编译安装过程优化 在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编...

(1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2**
如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件

nginx配置文件结构图

澳门新濠3559 1

nginx配置文件主要分为四个部分:

  • main(全局设置)
  • server(主机配置)
  • upstream(负载均衡服务器设置)
  • location(URL匹配特点位置设置)
    server部分的指令主要用于指定主机和端口,upstream指令主要用于负载均衡和设置一系列的后端服务器,location部分用于匹配网页位置。server继承main,location继承server,upstream既不会继承也不会被继承。
nginx采用epoll事件模型,处理效率高

work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。

(3)开启高效传输模式

http {
include mime.types;
default_type application/octet-stream;
……
sendfile on;
tcp_nopush on;
……

Include mime.types; //媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令
default_type application/octet-stream; //默认媒体类型足够
sendfile on;//开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

注意:如果图片显示不正常把这个改成off。

tcp_nopush on;必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。)

(4)连接超时时间
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的

keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
  • keepalived_timeout客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接

  • tcp_nodelay;也是防止网络阻塞,不过要包涵在keepalived参数才有效

  • client_header_buffer_size 4k;客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

  • open_file_cache max=102400 inactive=20s;这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。

  • open_file_cache_valid 30s;这个是指多长时间检查一次缓存的有效信息。

  • open_file_cache_min_uses 1;open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。

  • client_header_timeout设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误

  • client_body_timeout设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示

  • reset_timeout_connection 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。

  • send_timeout响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接

  • server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。

  • client_max_body_size上传文件大小限制
    (5)fastcgi调优

fastcgi_connect_timeout    600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
  • fastcgi_connect_timeout 600; #指定连接到后端FastCGI的超时时间。

  • fastcgi_send_timeout 600; #向FastCGI传送请求的超时时间。

  • fastcgi_read_timeout 600; #指定接收FastCGI应答的超时时间。

  • fastcgi_buffer_size 64k; #指定读取FastCGI应答第一部分需要用多大的缓冲区,默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。

  • fastcgi_buffers 4 64k; #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。

  • fastcgi_busy_buffers_size 128k; #建议设置为fastcgi_buffers的两倍,繁忙时候的buffer

  • fastcgi_temp_file_write_size 128k; #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway

  • fastcgi_temp_path #缓存临时目录

  • fastcgi_intercept_errors on;#这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。

注:静态文件不存在会返回404页面,但是php页面则返回空白页!!

  • fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;# fastcgi_cache缓存目录,可以设置目录层级,比如1:2会生成16*256个子目录,cache_fastcgi是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,如果缓存数据在失效时间内没有被访问,将被删除,max_size表示最多用多少硬盘空间。

fastcgi_cache cache_fastcgi; #表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误放生。cache_fastcgi为proxy_cache_path指令创建的缓存区名称

  • fastcgi_cache_valid 200 302 1h; #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用
  • fastcgi_cache_valid 301 1d; #将301应答缓存一天
  • fastcgi_cache_valid any 1m; #将其他应答缓存为1分钟
  • fastcgi_cache_min_uses 1; #该指令用于设置经过多少次请求的相同URL将被缓存。
  • fastcgi_cache_key ; #该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.一般根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key 。
  • fastcgi_pass #指定FastCGI服务器监听端口与地址,可以是本机或者其它

总结:
nginx的缓存功能有:proxy_cache / fastcgi_cache
proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态。fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容。proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端宽带。fastcgi_cache缓存减少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力。

(6)gzip调优
使用gzip压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。
Nginx启用压缩功能需要你来ngx_http_gzip_module模块,apache使用的是mod_deflate
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗CPU的!

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

(7)expires缓存调优
缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来, Expires缓存配置在server字段里面

location ~* .(ico|jpe?g|gif|png|bmp|swf|flv)$ {
  expires 30d;
  #log_not_found off;
  access_log off;
}

location ~* .(js|css)$ {
  expires 7d;
  log_not_found off;
  access_log off;
} 

注:log_not_found off;是否在error_log中记录不存在的错误。默认是。
总结:
expire功能优点
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,是web服务非常重要的功能。 expire功能缺点:

  • 被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
    解决办法:第一个缩短缓存时间,例如:1天,但不彻底,除非更新频率大于1天;第二个对缓存的对象改名。
    网站不希望被缓存的内容 1)网站流量统计工具2)更新频繁的文件(google的logo)

(8)防盗链
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:
1:水印,品牌宣传,你的带宽,服务器足够
2:防火墙,直接控制,前提是你知道IP来源
3:防盗链策略下面的方法是直接给予404的错误提示

location ~*^.+.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
    valid_referers noneblocked  www.benet.com benet.com;
    if($invalid_referer) {
      #return 302  http://www.benet.com/img/nolink.jpg;
      return 404;
        break;
    }
    access_log off;
 }

参数可以使如下形式:none 意思是不存在的Referer头(表示空的,也就是直接访问,比如直接在浏览器打开一个图片)blocked 意为根据防火墙伪装Referer头,如:“Referer:XXXXXXX”。server_names 为一个或多个服务器的列表,0.5.33版本以后可以在名称中*使用“”通配符

(9)内核参数优化

  • fs.file-max = 999999:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接数,需根据实际情况配置。**
  • net.ipv4.tcp_max_tw_buckets = 6000 #这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
    注:主动关闭连接的服务端会产生TIME_WAIT状态的连接
  • 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连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
  • net.ipv4.tcp_keepalive_time = 30:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。
  • net.ipv4.tcp_syncookies = 1#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
  • net.core.somaxconn = 40960 #web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到128,而nginx定义的*NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。

注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关
somaxconn参数:定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。

  • net.core.netdev_max_backlog = 262144 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
  • net.ipv4.tcp_max_syn_backlog = 262144 #这个参数标示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
  • net.ipv4.tcp_rmem = 10240 87380 12582912#这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
  • net.ipv4.tcp_wmem = 10240 87380 12582912:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。*
  • net.core.rmem_default = 6291456:这个参数表示内核套接字接受缓存区默认的大小。
  • net.core.wmem_default = 6291456:这个参数表示内核套接字发送缓存区默认的大小。
  • net.core.rmem_max = 12582912:这个参数表示内核套接字接受缓存区的最大大小。
  • net.core.wmem_max = 12582912:这个参数表示内核套接字发送缓存区的最大大小。
  • net.ipv4.tcp_syncookies = 1:该参数与性能无关,用于解决TCP的SYN攻击。

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

fs.file-max = 999999
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 = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
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 = 40960
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
执行sysctl  -p使内核修改生效

(10)关于系统连接数的优化:

linux 默认值 open files为1024

ulimit -n 1024
说明server只允许同时打开1024个文件
使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux 默认只有1024 ,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大
在/etc/security/limits.conf最后增加:

*               soft    nofile          65535
*               hard    nofile          65535
*               soft    noproc          65535
*                hard    noproc          65535

http模块

个人配置

#user  nobody;
worker_processes  4;
worker_rlimit_nofile 1024;

#pid        logs/nginx.pid;


events {

        use epoll;

        worker_connections 65535;

        multi_accept on;

}


http {
    include       mime.types;
    default_type  application/octet-stream;


    #access_log  logs/access.log  main;
    log_format  main  '$http_X_Real_IP $http_CLIENTIP $remote_addr $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $request_time';

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  30;
    tcp_nodelay on;
    client_header_buffer_size 4k;
    open_file_cache max=102400 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;
    client_header_timeout 15;
    client_body_timeout 15;
    reset_timedout_connection on;
    send_timeout 15;
    server_tokens off;
    client_max_body_size 10m;

    gzip  off;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    fastcgi_connect_timeout    600;
    fastcgi_send_timeout 600;
    fastcgi_read_timeout 600;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;

    server {

        listen       80;
        server_name  localhost;
        access_log  /usr/local/logs/nginx/access.log  main;
        root        html;
        index       index.html index.htm index.php;

        #图片缓存时间        
        location ~* .(ico|jpe?g|gif|png|bmp|swf|flv)$ {
          expires 30d;
          #log_not_found off;
          access_log off;
        }
        #JS和CSS缓存时间
        location ~* .(js|css)$ {
          expires 7d;
          log_not_found off;
          access_log off;
        }

        error_page   500 502 503 504  /50x.html;
        location / {
                try_files $uri $uri/ @rewrites;
        }

        location @rewrites {
                rewrite ^ /index-development.php last;
        }

        location = /robots.txt {
                access_log off;
                log_not_found off;
         }


        location ~ .php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    #upstream php_group{
    #    server 127.0.0.1:9119 weight=1;
    #    server 127.0.0.1:9120 weight=1;
    #}

    include vhost/*;
}

events模块

events{
   use epoll;
   worker_connections  65536;
}
  • use事件模块指令,用来指定nginx的工作模式。nginx支持select、poll、kqueue、epoll和/dev/poll工作模式。其中select和poll是标准工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用于Linux平台上,而kqueue用于 BSD系统中。对于Linux系统,epoll工作模式是首选。
  • worker_connections设置每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。nginx作为反向代理服务器,计算公式为最大连接数=worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile。当nginx作为http服务器时,计算公式里面是除以2。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令ulimit -n 65536后worker_connections的设置才能生效。
  • worker_processes 4;
    worker_cpu_affinity 0001 0010 0100 1000
    比如8核配置
  • worker_processes 8;
    澳门新濠3559,worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
    worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
    Nginx最多可以打开文件数
  • worker_rlimit_nofile 65535;
    这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
    注:
    文件资源限制的配置可以在/etc/security/limits.conf
    设置,针对root/user等各个用户或者*代表所有用户来设置。
  • soft nofile 65535
  • hard nofile 65535
    用户重新登录生效(ulimit -n)
FastCGI配置

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;
fastcgi_cache TEST;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
  • fastcgi_connect_timeout指定连接到后端FastCGI的超时时间
  • fastcgi_send_timeout指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间
  • fastcgireadtimeout指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间
  • fastcgi_buffer_size用于指定读取FastCGI应答第一部分需要多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。
  • fastcgi_buffers指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等
  • fastcgi_busy_buffers_size默认值是fastcgi_buffers的两倍
  • fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍
  • fastcgi_cache表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生。但是开启缓存也会引起很多问题,要视具体情况而定
  • fastcgi_cache_path FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间
  • fastcgi_cache_valid用来指定应答代码的缓存时间。实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟
events {
  use epoll;
  worker_connections 65535;
  multi_accept on;
}
客户端head缓存设置
server_names_hash_bucket_size 128;
client_header_buffer_size 32k; 
large_client_header_buffers 4 128k; 
client_max_body_size 8m;  
client_max_body_size 10m; 
client_body_buffer_size 128k; 
sendfile on ; 
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65 : 
client_body_timeout 60s;
send_timeout 60s;
  • server_names_hash_bucket_size服务器名字的hash表大小
  • client_header_buffer_size用来指定来自客户端请求头的header buffer 大小。对于大多数请求,1K的缓存已经足够了,如果自定义了消息头或有更大的cookie,可以增大缓存区大小
  • large_client_header_buffers用来指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,128k为大小,最大缓存为4个128KB
  • client_max_body_size客户端请求的最大的单个文件字节数
  • client_max_body_size允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
  • client_body_buffer_size缓冲区代理缓冲用户端请求的最大字节数
  • sendfile 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。开启 tcpnopush on; 和tcpnodelay on; 防止网络阻塞
  • keepalive_timeout长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源
  • client_body_timeout 用于设置客户端请求主体读取超时时间,默认是60s。如果超过这个时间,客户端还没有发送任何数据,nginx将返回Request time out(408)错误
  • send_timeout用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接

(2)Nginx****事件处理模型

基础配置
http  {
  include       mime.types;
  default_type  application/octet-stream;
  charset  gb2312;
}
  • include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
  • default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口
  • charset 指定客户端编码格式
 grep ^processor /proc/cpuinfo | wc -l 
[root@lx~]# vi/usr/local/nginx1.10/conf/nginx.conf
worker_processes  4;
[root@lx~]# /usr/local/nginx1.10/sbin/nginx-s reload
[root@lx~]# ps -aux | grep nginx |grep -v grep
root 9834  0.0  0.0 47556  1948 ?      Ss  22:36  0:00 nginx: master processnginx
www 10135  0.0 0.0  50088  2004 ?       S    22:58  0:00 nginx: worker process
www 10136  0.0  0.0 50088  2004 ?        S   22:58  0:00 nginx: worker process
www 10137  0.0  0.0 50088  2004 ?        S   22:58  0:00 nginx: worker process
www 10138  0.0  0.0 50088  2004 ?        S   22:58  0:00 nginx: worker process
gzip模块
gzip on;
gzip_min_length 1k;
gzip_buffers    4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
  • gzip开启gzip压缩输出
  • gzip_min_length最小压缩文件大小,页面字节数从header头的Content-Length中获取。默认值为0,不管多大页面都压缩,建议设置成大于1K的字节数,小于1K可能会越压越大
  • gzip_buffers压缩缓冲区,表示申请四个16K的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储gzip压缩结果
  • gzip_http_version用于设置识别HTTP协议版本,默认是1.1,目前主流浏览器都已成指出。(默认1.1,前端如果是squid2.5请使用1.0)
  • gzip_comp_level压缩等级,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是消耗CPU资源
  • gzip_types压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn
  • gzip_vary和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据
  • gzip_proxiednginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头 limit_zone开启限制IP连接数的时候需要使用

Nginx****运行CPU亲和力
比如4核配置

编辑:操作系统 本文来源:比如进程数、运行的身份、PID存放目录等都在m

关键词: