企业级nginx服务优化(一)

配置文件总结

nginx.conf      httpd.conf    httpd-vhosts.conf  httpd-mpm.conf

my.cnf          php.ini        php-fpm.conf


更改版本信息

curl -I 192.168.10.11

Server: nginx/1.6.3


第一种   修改版本及版本号

nginx编译前更改

src/core/nginx.h

#define nginx_version      1008001

#define NGINX_VERSION      "1.8.1"  #修改想要显示的版本如:2.2.23

#define NGINX_VER          "nginx/" NGINX_VERSION        #将nginx修改成想要显示的软件名称

#define NGINX_VAR          "NGINX" #将nginx修改成想要显示的软件名称(Evan Web Server)

#define NGX_OLDPID_EXT     ".oldbin"

src/http/ngx_http_header_filter_module.c

static char ngx_http_server_string[] = "Server: nginx" CRLF;  #将nginx修改为想要的版本

src/http/ngx_http_special_response.c

"


nginx
" CRLF  #将nginx修改为想要的版本信息


第二种   隐藏版本号

nginx配置文件里增加 server_tokens off;

server_tokens作用域是http server location语句块

server_tokens默认值是on,表示显示版本信息,设置server_tokens值是off,就可以在所有地方隐藏nginx的版本信息。

http{

      server_tokens off;

}

/application/nginx/sbin/nginx -s reload

nginx/1.6.3-----------------------变成了nginx   //404 Not Found


更改掉nginx的用户

grep "#user"    nginx.conf.default           //默认文件

#user  nobody;

1    vim   nginx.conf   //修改配置文件               

user  nginx  nginx;

2   ./configure  --user=nginx   --group=nginx 

ps -ef | grep nginx

root      56512      1  0 02:35 ?        00:00:00 nginx: master process      //主进程用root运行,可以更为nginx,端口必须大于1024

nginx     57470  56512  0 04:04 ?        00:00:00 nginx: worker process 



配置nginx worker进程个数

worker_processes  1;          //等于CPU的核心数       cat /proc/cpuinfo |grep -c processor 查CPU

更改为

worker_processes  2;    查看

nginx      1822   1784  0 04:14 ?        00:00:00 nginx: worker process

nginx      1823   1784  0 04:14 ?        00:00:00 nginx: worker process


配置worker_cpu-affinity 

worker_processes  2;

worker_cpu_affinity    0101  1010;              //把每个work进程分配到单独的CPU核数上

worker_processes  4;

worker_cpu_affinity    0001  0010 0100 1000 

worker_processes  8;

worker_cpu_affinity    0001  0010 0100 1000  0001 0010 0100 1000


安装压力测试软件  webbench

wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz  

tar zxf webbench-1.5.tar.gz

cd webbench-1.5

make && make install

webbench -c 20000  -t 180  http://192.168.10.11/     // -c 表示客户端数,-t 表示时间

taskset - retrieve or set a process’s CPU affinity

taskset  -c  1,2,3   /etc/init.d/mysql  start  //某个进程跑在某个CPU上


事件处理模型优化  在linux下epoll模型

events {  //设定nginx工作模式及连接数上限

        use    epoll;

        worker_connections  20480;    //每个进程的最大连接数,默认1024

}

Max_client=worker_processes*worker_connections;   最大数

进程的最大连接数受系统进程最大打开文件数限制,执行ulimit -HSn 65535,或者配置相应文件的   worker_connections的设置后生效。

worker_rlimit_nofile    65535;      //每个进程最大文件打开数  主标签段


优化服务器名字hash表大小

http://hequan.blog.51cto.com/              //泛解析

http{

server_names_hash_bucket_size   64;

server_names_hash_max_size  512;              //默认为512,一般为CPU L1的4-5倍

}


开启高效的文件传输模式

sendfile  on;

tcp_nopush   on;


连接超时时间      // php服务建议 短连接


keepalive_timeout     60;               //客户端连接保持会话的超时时间

tcp_nodelay    on;

client_header_timeout  15;    //客户端请求头读取超时时间,超过不发送数据,返回408错误

client_body_timeout  15;      //主体

send_timeout    15;    // 响应客户端的超时时间


上传文件大小限制    (动态应用)

client_max_body_size   10m;           //客户端最大上传               超过了报413错误    0是不检查  php默认2m


fastcgi 调优  


location ~ .*\.(php|php5)?$ {

    fastcgi_pass   127.0.0.1:9000;

    fastcgi_index  index.php;

    include        fastcgi.conf;

}

fastcgi_connect_timeout   300;   //连接

fastcgi_send_timeout   300;    //传送请求

fastcgi_read_timeout   300;  //应答

fastcgi_buffer_size   64k;   //缓冲区

fastcgi_buffer     4      64k;            //       多少个 多大的缓冲区

fastcgi_busy_buffer_size   128k;

fastcgi_temp_buffer_size   128k;

fastcgi_cache   hequan_nginx

fastcgi_cache_valid   200 302  h;

fastcgi_cache_valid 301 1d;

fastcgi_cache_valid any  1m;

fastcgi_cache_min_uses  1;


drwx------ 12 nginx root 4096 4月   5 04:32 fastcgi_temp   // 临时文件


企业级nginx服务优化(二 )

配置nginx  gzip压缩功能

gzip  on;

gzip_min_length   1k;     // 大于1K才压缩

gzip_buffers    4  32k;   // 压缩缓存区大小

gzip_http_version  1.1;

gzip_comp_level  9;   //压缩比率  1-9

gzip_types     text/css  text/xml  application/javascript ;       // 压缩类型,不同版本,类型不一样,

gzip_vary on;   //  vary  header支持


测试软件  unzip test_deflate.zip    火狐流量器加载yslow插件,可以查看缓存结果


 include         mime.types;

# cat        conf/mime.types           //版本不一样,类型不一样

types {

    text/html                             html htm shtml;

    text/css                              css;

    text/xml                              xml;

    p_w_picpath/gif                             gif;

    p_w_picpath/jpeg                            jpeg jpg;

    application/javascript                js;

    application/atom+xml                  atom;

    application/rss+xml                   rss;


apache  mod_deflate  //  编译时  --enable-deflate  


nginx  expire缓存功能      在客户端本地保存多久    在server标签里


location  ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

        {

        expires    3650d;

}

location  ~ .*\.(js|css)?$

        {

        expires 30d;

}


实例:

location ~(robots.txt) {                  //  为robots.txt 为7天并不记录404

          log_not_found  off;

          expires    7d;

          break;

}     


apache


./configure   --enable-expires   


cd /httpd-2.2.22/modules/metadata/              //切到apache 软件目录

/application/apache/bin/apxs  -c -i -a mod_expires.c     // 已dso的方式编译到apache

ll   /aplication/apache2.2.22/modules/mod_expires.so      //检查


http://www.51cto.com/robots.txt     /// 写这样的一个文件

User-agent: *
Crawl-delay: 500
Disallow: /wuyou/
Disallow: /php/
Disallow: /wuyou_admin/

Disallow: /actions/

修改nginx.conf,禁止网络爬虫的ua,返回403。

server {

listen 80;

server_name 127.0.0.1;

#添加如下内容即可防止爬虫

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot")

{

return 403;    //也可以把上面改成浏览器,禁止浏览器访问

}


配置nginx 日志切割脚本          sysog日志分析         crontlog

日志切割

cd   /application/nginx/logs  &&  \

/bin/mv www_access.log  www_access_$(date  +%F  -d  -1day).log

/application/nginx/sbin/nginx -s reload

 crontab -e

00 00 * * *   /bin/sh  /server/scripts/cut_nginx_log.sh    >/dev/null    2&1


不记录不需要的访问日志

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$

     {     access_log  off;

}

drwxr-xr-x 2 root root 4096 5月   5 21:09 logs/           //主进程是root 是可以写入logs


最小化apache目录及文件权限

  • 所有站点目录的用户和组都应为root

  • 所有目录权限是755

  • 所有文件权限是644

网站服务的用户不能用root 



限制ip访问

locaion ~  ^/hequan/ {

     allow 192.168.10.0/24;

     deny all;

}


报错显示

 error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }


-rw-r--r-- 1 root root   537 4月   3 19:53 50x.html


tmpfs是一种基于内存的文件系统

vim  /etc/rc.local

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

vim /etc/fstab


df -hT 

Filesystem           Type   Size  Used Avail Use% Mounted on

tmpfs                tmpfs  100M     0  100M   0% /tmp


php_flag  engine  off  //  apache不解析PHP


企业级nginx服务优化(三 )Apache+防盗链

apache   worker/prefork

 /application/apache/bin/apachectl -l | sed -n '/worker\|prefork/p'

  worker.c

Server MPM:     Worker

./configure    --with-mpm=worke  //编译时指定,,默认是prefork


prefork  默认

使用多个子进程,每个子进程只有一个线程

效率高,稳定,安全,比worker消耗资源多

vim  /application/apache/conf/extra/httpd-mpm.conf

    StartServers        10               //服务启动进程数            

    MinSpareServers      10          //最小空闲数量

    MaxSpareServers     15           //最大空闲数量

    ServerLimit       2000

    MaxClients          1000              //最大进程  并发

    MaxRequestsPerChild   5000        //子进程处理的最大进程数           0=不限制

ps -ef | grep http| grep -v grep | wc -l           //查看并发连接

6


worker    线程与进程的结合

vim  /application/apache/conf/extra/httpd-mpm.conf

    StartServers          2             

    MaxClients           2000           //并发的客户端连接数量

    ServerLimit       25   //总进程数

    MinSpareThreads     50

    MaxSpareThreads     200

    ThreadLimit         200

    ThreadsPerChild        100   // 持续的每个服务器的工作线程数

    MaxRequestsPerChild   0   // 单个子进程累计最多处理到少个请求,默认0,不限制的意思


MaxClient <=  ServerLimit*  ThreadsPerChild

MaxClient %ThreadsPerChild  =0


cat /application/apache/conf/extra/httpd-default.conf

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 5

UseCanonicalName Off

AccessFileName .htaccess

ServerTokens Full

ServerSignature On

HostnameLookups Off


并发连接数

pstree -a | grep http |grep -v grep  | wc -l

110


apache  web 服务防盗链

             RewriteEngine  on

             RewriteCond %{HTTP_REFERER} !^http://网站域名/.*$ [NC]

             RewriteRule .*\.(gif|jpg)$   http://代替图标 [R,NC]


Nginx防盗链的配置

location ~* \.(gif|jpg|png|swf|flv|bmp)$ {

 valid_referers none blocked *.hequan.com hequan z.com;

  if ($invalid_referer) {

   #rewrite ^/ http://www.hequan .com/403.html;

   return 403;

  }

}


企业级nginx服务优化(四 )伪静态+php.ini

apache伪静态

打开apache的配置文件httpd.conf  

1.把#LoadModule rewrite_module modules/mod_rewrite.so前面的#去掉。

2.找到

#

# AllowOverride controls what directives may be placed in .htaccess files.

# It can be “All”, “None”, or any combination of the keywords:

# Options FileInfo AuthConfig Limit

#

AllowOverride None

把 AllowOverride None 改为 AllowOverride All


Discuz伪静态配置文件

Apache Web Server(独立主机用户)


        RewriteEngine On
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page\%3D$4&page=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3&%1
        RewriteCond %{QUERY_STRING} ^(.*)$
        RewriteRule ^(.*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3&%1


正则表达式匹配,其中:

代码如下:

* ~ 为区分大小写匹配

* ~* 为不区分大小写匹配

* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件

* -d和!-d用来判断是否存在目录

* -e和!-e用来判断是否存在文件或目录

* -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite

* break 终止匹配, 不再匹配后面的规则

* redirect 返回302临时重定向 地址栏会显示跳转后的地址

* permanent 返回301永久重定向 地址栏会显示跳转后的地址


Discuz伪静态配置文件

Nginx Web Server

rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
        return 404;

}


 CDN


php                 php.ini              php-fpm.com-------nginx+fcgi


php.ini

338 safe_mode = On                             // 安全模式打开

344 safe_mode_gid = Off

385 disable_functions = system,passthru,exec,shell_exec,popen,p hpinfo                       //关闭危险函数,如果打开的安全模式,就不用了

435 expose_php = Off                                 //关闭php版本信息在http头中的泄露

703 register_globals = Off                             //默认关闭全局环境变量

756 magic_quotes_gpc = On                         //打开    防止SQL注入

538 display_errors = Off                                          //错误信息关闭,测试时开启

           643 error_log = /app/logs/php_errors.log            // 上面打开,下面才可以

444 max_execution_time = 30                         //脚本最大允许执行时间 秒

465 memory_limit = 128M                                  //脚本申请到的最大内存字节数

454 max_input_time = 60                                  //脚本等待输入数据最长时间

891 upload_max_filesize = 2M                             //最大上传文件

894 max_file_uploads = 20                                    //1个请求最大上传文件数量

902 allow_url_fopen = Off              //禁止打开远程地址

854 cgi.fix_pathinfo=0                   //防止nginx文件类型错误解析漏洞

1461 session.save_handler = memcache

1490 session.save_path = "tcp://192.168.10.11:11211"       //为memcached数据库缓存的ip及端口


CGI      公共网关接口

PastCGI   php-fpm

php5.3以上: --enable-fpm

php5.2    --enable-fastcgi          --enable-fpm   --enalbe-force-cgi


vim /application/php/etc/php-fpm.conf

pm = dynamic

pid =  /app/logs/php-fpm.pid

error_log = /app/logs/php-fpm.log

log_level = error

rlimit_files = 32768

listen.owner = nginx

listen.group = nginx

pm.max_children = 1024

pm.start_servers = 16

pm.min_spare_servers = 5

pm.max_spare_servers = 20

pm.process_idle_timeout = 15s;

pm.max_requests = 2048

slowlog = /app/logs/$pool.log.slow

request_slowlog_timeout = 10