1.1 Nginx优化分类

安全优化(提升网站安全性配置)

性能优化(提升用户访问网站效率)

1.2 Nginx安全优化

1.2.1 隐藏nginx版本信息优化

官方配置参数说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens

官方参数:

  1. Syntax: server_tokens on | off | build | string;
  2. Default: server_tokens on;
  3. Context: http, server, location

配置举例:

  1. [root@web01 ~]# cat /application/nginx/conf/nginx.conf
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile off;
  10. keepalive_timeout 65;
  11. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  12. '$status $body_bytes_sent "$http_referer" '
  13. '"$http_user_agent" "$http_x_forwarded_for"';
  14. server {
  15. listen 80;
  16. server_name www.nmtui.com;
  17. server_tokens off;
  18. location / {
  19. root html/www;
  20. index index.html index.htm;
  21. }
  22. access_log logs/access_www.log main;
  23. }
  24. }

测试结果:

  1. [root@web01 ~]# curl -I 10.0.0.8
  2. HTTP/1.1 200 OK
  3. Server: nginx
  4. Date: Wed, 01 Nov 2017 18:32:40 GMT
  5. Content-Type: text/html
  6. Content-Length: 10
  7. Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT
  8. Connection: keep-alive
  9. ETag: "59efe6f8-a"
  10. Accept-Ranges: bytes

1.2.2 修改nginx版本信息

修改版本信息需要修改程序源文件信息

修改内核信息

  1. [root@web01 nginx-1.10.2]# vim src/core/nginx.h
  2. # ···
  3. 13 #define NGINX_VERSION "1.0"
  4. 14 #define NGINX_VER "clsn/" NGINX_VERSION
  5. 22 #define NGINX_VAR "clsn"
  6. # ···

修改头部信息

  1. [root@web01 nginx-1.10.2]# vim src/http/ngx_http_header_filter_module.c
  2. # ···
  3. 49 static char ngx_http_server_string[] = "Server: clsn" CRLF;
  4. # ···

修改错误页显示

  1. [root@web01 nginx-1.10.2]# vim src/http/ngx_http_special_response.c
  2. # ···
  3. # 此处可以不修改
  4. 21 static u_char ngx_http_error_full_tail[] =
  5. 22 "<hr><center>" NGINX_VER "</center>" CRLF
  6. 23 "</body>" CRLF
  7. 24 "</html>" CRLF
  8. 25 ;
  9. # ···
  10. 28 static u_char ngx_http_error_tail[] =
  11. 29 "<hr><center>clsn</center>" CRLF
  12. 30 "</body>" CRLF
  13. 31 "</html>" CRLF
  14. 32 ;
  15. # ···

修改完成后重新编译

  1. [root@web01 nginx-1.10.2]# ./configure --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

重启服务

  1. [root@web01 nginx-1.10.2]# /etc/init.d/nginx restart

访问测试是否修改成功

  1. [root@web01 ~]# curl -I 127.0.0.1
  2. HTTP/1.1 200 OK
  3. Server: clsn
  4. Date: Wed, 01 Nov 2017 19:05:43 GMT
  5. Content-Type: text/html
  6. Content-Length: 10
  7. Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT
  8. Connection: keep-alive
  9. ETag: "59efe6f8-a"
  10. Accept-Ranges: bytes

1.2.3 修改worker进程的用户

第一种方法:利用编译安装配置参数,设定nginx默认worker进程用户

  1. useradd -s /sbin/nologin -M www
  2. ./configure --user=www --group=www

第二种方式:编写nginx服务配置文件,设定nginx默认worker进程用户

官方配置参数说明:http://nginx.org/en/docs/ngx_core_module.html#user

  1. Syntax:user user [group];
  2. Default: user nobody nobody;
  3. Context: main

配置举例:

  1. [root@web02 conf]# cat nginx.conf
  2. user www www; # 主区块添加user参数
  3. worker_processes 1;
  4. events {
  5. worker_connections 1024;
  6. }

查看是否生效

  1. [root@web01 nginx-1.10.2]# ps -ef|grep nginx
  2. root 16987 1 0 15:14 ? 00:00:00 nginx: master process nginx
  3. clsn 18484 16987 0 15:22 ? 00:00:00 nginx: worker process
  4. root 18486 9593 0 15:22 pts/0 00:00:00 grep --color=auto nginx

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

默认语法说明:

  1. syntaxclient_max_body_size size #<==参数语法
  2. defaultclient_max_body_size 1m #<==默认值是1m
  3. contexthttpserverlocation #<==可以放置的标签段

举例配置:

  1. http {
  2. sendfile on;
  3. keepalive_timeout 65;
  4. client_max_body_size 8m; # 设置上传文件最大值8M
  5. }

1.2.5 站点 Nginx站点目录及文件URL访问控制

01. 根据目录或扩展名,禁止用户访问指定数据信息

  1. location ~ ^/images/.*\.php|php5|sh|pl|py|html$
  2. {
  3. deny all;
  4. }
  5. location ~ ^/static/.*\.php|php5|sh|pl|py$
  6. {
  7. deny all;
  8. }
  9. location ~* ^/data/attachment|avatar)/.*\.php|php5$
  10. {
  11. deny all;
  12. }

02. 当访问禁止的数据信息时,进行页面跳转

Nginx下配置禁止访问*.txt和*.doc文件。

实际配置信息如下:

  1. location ~* \.txt|doc$ {
  2. if (-f $request_filename){
  3. root /data/www/www;
  4. #rewrite …..可以重定向到某个URL
  5. break;
  6. }
  7. }
  8. location ~* \.txt|doc${
  9. root /data/www/www;
  10. denyall;
  11. }

03. 根据IP地址或网络进行访问策略控制

  1. location / {
  2. deny 192.168.1.1;
  3. allow 192.168.1.0/24;
  4. allow 10.1.1.0/16;
  5. deny all;
  6. }

04. 采用if判断方式,进行访问控制

  1. if $remote_addr = 10.0.0.7 ){
  2. return 403;
  3. }

1.2.6 配置Nginx,禁止非法域名解析访问企业网站

第一种方式:配置一个server虚拟主机区块,放置在所有server区块最前面

  1. server {
  2. listen 80;
  3. server_name - ;
  4. return 501;
  5. }

第二种方式:将计就计,通过你的域名访问时候,自动跳转到我的域名上

  1. server {
  2. listen 80 default_server;
  3. server_name _;
  4. rewrite ^(.*) http://www.nmtui.com/$1 permanent;
  5. }
  6. if $host !~ ^www\.nmtui\.com$
  7. {
  8. rewrite ^(.*) http://www.nmtui.com/$1 permanent;
  9. }

1.2.7 Nginx图片及目录防盗链解决方案

什么是资源盗链 ?

简单地说,就是某些不法网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到填充自身网站的效果。

实现盗链过程:

01. 真正的合法网站(盗链的目标)  web01   www.nmtui.com www站点目录有一个oldboy.jpg图片

  1. # 配置静态虚拟主机
  2. server {
  3. listen 80;
  4. server_name www.nmtui.com;
  5. location / {
  6. root html/www;
  7. index index.html index.htm;
  8. }
  9. # 确认生成盗链文件

02. 不合法的网站(真正盗链网站)  www.daolian.com

  1. # 编写一个html盗链文件
  2. <html>
  3. <head>
  4. <title>惨绿少年</title>
  5. </head>
  6. <body bgcolor=green>
  7. 惨绿少年的博客!
  8. <br>我的博客是
  9. <a
  10. href="http://www.nmtui.com" target="_blank">博客地址
  11. </a>
  12. <img src="http://www.nmtui.com/clsn.jpg">
  13. </body>
  14. </html>

编写盗链虚拟主机

  1. server {
  2. listen 80;
  3. server_name www.daolian.org;
  4. location / {
  5. root html;
  6. index index.html index.htm;
  7. }
  8. }

至此就实现了盗链。

03 常见防盗链解决方案的基本原理

1)     根据HTTP referer实现防盗链

利用referer,并且针对扩展名rewrite重定向,下面的代码为利用referer且针对扩展名rewrite重定向,即实现防盗链的Nginx配置。

  1. location ~* /\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
  2. root html/www;
  3. valid_referers none blocked *.nmtui.com nmtui.com;
  4. if $invalid_referer){
  5. rewrite ^/ http://www.nmtui.com/img/nolink.jpg;
  6. }
  7. }

设置expires的方法如下:

  1. [root@clsn www]# cat /application/nginx/conf/extra/www.conf
  2. server {
  3. listen 80;
  4. server_name www.nmtui.com;
  5. root html/www;
  6. index index.html index.htm;
  7. access_log logs/www_access.log main;
  8. #Preventing hot linking of images and other file types
  9. location ~* ^.+\.gif|jpg|png|swf|flv|rar|zip$ {
  10. valid_referers none blocked server_names *.nmtui.com nmtui.com;
  11. if $invalid_referer){
  12. rewrite ^/ http://www.nmtui.com/img/nolink.jpg;
  13. }
  14. access_log off;
  15. root html/www;
  16. expires 1d;
  17. break;
  18. }
  19. }

2) 根据cookie防盗链

3) 通过加密变换访问路径实现防盗链

4) 在所有网站资源上添加网站信息,让盗链人员帮你做推广宣传

1.2.8 NGINX错误页面友好显示

范例1:对错误代码403实行本地页面跳转,命令如下:

  1. ###www
  2. server {
  3. listen 80;
  4. server_name www.nmtui.com;
  5. location / {
  6. root html/www;
  7. index index.html index.htm;
  8. }
  9. error_page 403 /403.html; #<==当出现403错误时,会跳转到403.html页面
  10. }

# 上面的/403.html是相对于站点根目录html/www的。

范例2:50x页面放到本地单独目录下,进行优雅显示。

  1. # redirect server error pages to the static page /50x.html
  2. error_page 500 502 503 504 /50x.html;
  3. location = /50x.html {
  4. root /data0/www/html;
  5. }

范例3:改变状态码为新的状态码,并显示指定的文件内容,命令如下:

  1. error_page 404 =200 /empty.gif;
  2. server {
  3. listen 80;
  4. server_name www.nmtui.com;
  5. location / {
  6. root /data0/www/bbs;
  7. index index.html index.htm;
  8. fastcgi_intercept_errors on;
  9. error_page 404 =200 /ta.jpg;
  10. access_log /app/logs/bbs_access.log commonlog;
  11. }
  12. }

范例4:错误状态码URL重定向,命令如下:

  1. server {
  2. listen 80;
  3. server_name www.nmtui.com;
  4. location / {
  5. root html/www;
  6. index index.html index.htm;
  7. error_page 404 https://clsn.cnblogs.com;
  8. #<==当出现404错误时,会跳转到指定的URL https://clsn.cnblogs.com页面显示给用户,这个URL一般是企业另外的可用地址
  9. access_log /app/logs/bbs_access.log commonlog;
  10. }
  11. }

1.2.9 Nginx站点目录文件及目录权限优化

服务器角色

权限处理

安全系数

动态Web集群

目录权限755

文件权限644

所用的目录,以及文件用户和组都是root

环境为Nginx+PHP   文件不能被改,目录不能被写入,安全系数10

static图片集群

目录权限755

文件权限644

所用的目录,以及文件用户和组都是root

环境为Nginx    文件不能被改,目录不能被写入,安全系数10

上传upload集群

目录权限755

文件权限644

所用的目录,以及文件用户和组都是root

特别:用户上传的目录设置为755,用户和组使用Nginx服务配置的用户

文件不能被改,目录不能被写入,但是用户上传的目录允许写入文件且需要通过Nginx的其他功能来禁止读文件,安全系数8

1.2.10 Nginx防爬虫优化

范例1:阻止下载协议代理,命令如下:

  1. ## Block download agents ##
  2. if $http_user_agent ~* LWP::Simple|BBBike|wget
  3. {
  4. return 403;
  5. }

范例2:添加内容防止N多爬虫代理访问网站,命令如下:

这些爬虫代理使用“|”分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:

  1. if $http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot"
  2. {
  3. return 403;
  4. }

1.2.11 利用Nginx限制HTTP的请求方法

#Only allow these request methods

  1. if $request_method !~ ^(GET|HEAD|POST$ {
  2. return 501;
  3. }

#Do not accept DELETE,SEARCH and other methods

1.2.12 使用普通用户启动nginx

1、切换到普通用户家目录下,创建nginx所需文件

  1. [nginx@web01 ~]$ mkdir -p blog/{conf,logs,html}
  2. [nginx@web01 ~]$ cd blog/
  3. [nginx@web01 blog]$ cp /application/nginx/conf/nginx.conf.default ./conf/
  4. [nginx@web01 blog]$ grep -vE "^$|#" conf/nginx.conf.default > conf/nginx.conf
  5. [nginx@web01 blog]$ cp /application/nginx/conf/mime.types conf/

2、编写配置文件

  1. [nginx@web01 ~]$ cat blog/conf/nginx.conf
  2. worker_processes 4;
  3. worker_cpu_affinity 0001 0010 0100 1000;
  4. worker_rlimit_nofile 65535;
  5. error_log /home/nginx/blog/logs/error.log;
  6. user inca inca;
  7. pid /home/nginx/blog/logs/nginx.pid;
  8. events {
  9. use epoll;
  10. worker_connections 1024;
  11. }
  12. http {
  13. include mime.types;
  14. default_type application/octet-stream;
  15. sendfile on;
  16. keepalive_timeout 65;
  17. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  18. '$status $body_bytes_sent "$http_referer" '
  19. '"$http_user_agent" "$http_x_forwarded_for"';
  20. server {
  21. listen 8080;
  22. server_name www.etiantian.org;
  23. root /home/nginx/blog/html;
  24. location / {
  25. index index.html index.htm;
  26. }
  27. access_log /home/nginx/blog/logs/web_blog_access.log main;
  28. }
  29. }

注意:普通用户不能使用知名端口,需要使用其他端口启动服务

3、检查配置文件语法,并启动nginx服务

  1. /application/nginx/sbin/nginx -t -c /home/nginx/blog/conf/nginx.conf

  2. /application/nginx/sbin/nginx -c /home/nginx/blog/conf/nginx.conf &>/dev/null &

注意:忽略一些不正确的输出信息

1.3 Nginx性能优化

1.3.1 优化nginx worker进行个数

nginx服务主要有两个重要进程:

01) master进程:可以控制nginx服务的启动 停止 或重启

02) worker进程:处理用户请求信息,帮助用户向后端服务进行请求(php mysql)

添加worker进程方法

  1. vim nginx.conf
  2. worker_processes 1; # 修改nginx配置文件中worker_processes指令后面的数值

建议:worker进程数量=等于CPU的核数   worker进程数量=等于CPU的核数*2

如何在一个系统中获悉CPU核心是多少?

  1. ①. 利用top命令--按数字1,获取到CPU核数信息
  2. ②. grep processor /proc/cpuinfo|wc -l
  3. ③. lscpu

查看cpu核心数命令示例

示例一

  1. [root@web01 ~]# top # 按数字1
  2. top - 03:22:48 up 9 days, 26 min, 4 users, load average: 1.06, 0.99, 0.92
  3. Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
  4. Cpu0 : 0.2%us, 0.6%sy, 0.0%ni, 99.0%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
  5. Cpu1 : 0.1%us, 0.1%sy, 0.0%ni, 99.1%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
  6. Mem: 485984k total, 452536k used, 33448k free, 24984k buffers
  7. Swap: 786428k total, 5912k used, 780516k free, 242048k cached

示例二

  1. [root@web01 ~]# lscpu |grep CPU
  2. CPU op-mode(s): 32-bit, 64-bit
  3. CPU(s): 2

示例三

  1. [root@web01 ~]# grep processor /proc/cpuinfo
  2. processor : 0
  3. processor : 1

1.3.2 绑定不同的nginx进程到不同的CPU上

4个worker进程分配CPU资源方法:

  1. worker_processes 4
  2. worker_cpu_affinity 0001 0010 0100 1000

8个worker进程分配CPU资源方法;

  1. worker_processes 8
  2. worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000 # 分配8进程方法
  3. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

4个worker进程分配CPU资源方法:

  1. worker_processes 4
  2. worker_cpu_affinity 0101 1010 # 将进程分配到两颗CPU上

1.3.3 优化nginx事件处理模型

官方配置参数说明:http://nginx.org/en/docs/ngx_core_module.html#use

  1. Syntax: use method;
  2. Default:
  3. Context: events

关于事件处理模型可以参考:https://clsn.cnblogs.com/p/7750615.html#auto_id_10

举例配置:

  1. user www www;
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. use epoll; --- 指定使用的模型为epoll
  6. }

1.3.4 调整nginx单个进程允许的客户端最大连接数

查看nginx当前的打开文件数

  1. [root@clsn ~]# lsof -i:80
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. nginx 10422 root 6u IPv4 11868856 0t0 TCP *:http (LISTEN)
  4. nginx 10424 www 6u IPv4 11868856 0t0 TCP *:http (LISTEN)
  5. nginx 10425 www 6u IPv4 11868856 0t0 TCP *:http

修改最大连接数方法

  1. vim nginx.conf
  2. events #<==events指令是设定Nginx的工作模式及连接数上限
  3. {
  4. worker_connections 1024
  5. }

 说    :此数值设置不要超过系统最大打开文件数量。

1.3.5 配置Nginx worker进程最大打开文件数

举例配置:

  1. [root@web02 conf]# cat nginx.conf
  2. user www www;
  3. worker_processes 1;
  4. worker_rlimit_nofile 2048; # 设置worker进程打开文件数

1.3.6 优化nginx高效文件传输模式

sendfile参数的官方说明如下:

  1. syntaxsendfile on | off; #<==参数语法
  2. defaultsendfile off; #<==参数默认大小
  3. contexthttpserverlocationif in location #<==可以放置的标签段

说明:在系统内核中,利用零拷贝方式实现数据传输

实现高效数据传输的两种方式

第一种方式:tcp_nopush

  1. syntax tcp_nopush on | off; #<==参数语法
  2. default tcp_nopush off; #<==参数默认大小
  3. context httpserverlocation #<==可以放置的标签段

说明:将数据包积攒到一定量时再进行传输

参数作用:

  激活或禁用Linux上的TCP_NODELAY选项。这个参数启用只在连接传输进入到 keep-alive状态。TCP_NODELAY和TCP_CORK基本上控制了包的"Nagle化",Nagle化在这里 的含义是采用Nagle算法把较小的包组装为更大的帧。John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的。

  此算法解决的问题就是所谓的silly window syndrome,中文称"愚蠢窗口症候群",具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,很轻易地就能令网络发生拥塞,Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下希望发送小块数据,把这一选项关掉也是合乎需要的。

第二种方式:tcp_nodelay

  1. Syntax: tcp_nodelay on | off;
  2. Default: tcp_nodelay on;
  3. Context: http, server, location

说明:只要有数据包产生,不管大小多少,就尽快传输

参数作用:

  激活或禁用Linux上的TCP_CORK socket选项,tcp_cork是linux下tcp/ip传输的一个标准了,这个标准的大概的意思是,一般情况下,在tcp交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而tcp_cork选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞,已经是默认了。

  此选项仅仅当开启sendfile时才生效, 激活这个.tcp_nopush参数可以允许把http response header和响应数据文件的开始部分放在一个文件里发布,其积极的作用是减少网络报文段的数量。

强调:两个指令是相悖的,请选择其一开启,不要同时开启;

默认采用tcp_nodelay方式进行传输。

1.3.7 设置nginx服务超时参数

Nginx连接超时的参数设置

1) 设置参数: keepalive_timeout 60; # 长连接才有意义

keepalive_timeout参数的官方说明如下:

  1. syntaxkeepalive_timeout timeout [header_timeout];#<==参数语法
  2. defaultkeepalive_timeout 75s;#<==参数默认大小
  3. contexthttpserverlocation #<==可以放置的标签段

说明:客户端和服务端都没有数据传输时,进行超时时间倒计时,一旦超时时间读取完毕还没有数据传输,就断开连接

2) 设置参数:client_header_timeout 55;

  1. syntaxclient_header_timeout time; #<==参数语法
  2. defaultclient_header_timeout 60s; #<==参数默认大小
  3. contexthttpserver #<==可以放置的标签段

说明:表示定义客户端请求报文发送的间隔超时时间,客户端发送的请求报文中请求头信息的间隔时间

3)设置参数:client_body_timeout 55;

  1. syntaxclient_body_timeout time; #<==参数语法
  2. defaultclient_body_timeout 60s; #<==默认值是60秒
  3. contexthttpserverlocation #<==可以放置的标签段

说明:表示定义服务端响应报文发送的间隔超时时间,客户端发送的请求报文中请求主体信息的间隔时间

4)设置参数:send_timeout 60s

  1. syntaxsend_timeout time; #<==参数语法
  2. defaultsend_timeout 60s; #<==默认值是60秒
  3. contexthttpserverlocation #<==可以放置的标签段

说明:表示定义客户端读取服务端响应报文的间隔超时时间,服务端发送的响应报文间隔时间

1.3.8 配置Nginx gzip压缩实现性能优化

1.     Nginx gzip压缩功能介绍

Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到用户客户端之前, Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

2.     Nginx gzip压缩的优点

提升网站用户体验:

  发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验提升了,网站口碑就好了。

节约网站带宽成本:

  数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍 微消耗一些CPU资源,这个一般可以忽略。

此功能既能提升用户体验,又能使公司少花钱,一举多得。对于几乎所有的Web服务来说,这 是一个非常重要的功能,Apache服务也有此功能。

官方用法参考链接:http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip

  1. gzip on;
  2. gzip_min_length 1k;
  3. gzip_buffers 4 16k;
  4. gzip_http_version 1.1;
  5. gzip_comp_level 4;
  6. gzip_types text/css text/xml application/javascript;
  7. gzip_vary on;

说明:将服务端响应的数据信息进行压缩,可以有效节省带宽,提高用户访问效率

需要和不需要压缩的对象

  1. 纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件。
  2. 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。
  3. 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的。
  4. 如果再压缩很可能不会减小或减小很少,或者有可能增大,同时压缩时还会消耗大量的CPU、内存资源。

压缩配置参数说明

  1. gzip on ;
  2. #<==开启gzip压缩功能。
  3.  
  4. gzip_min_length lk;
  5. #<==设置允许压缩的页面最小宇节数,页面宇节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K,如果小于1K可能会越压越大。
  6.  
  7. gzip_buffers 4 16k;
  8. #<==压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据 大小相同的内存空间来存储gzip压缩结果。
  9.  
  10. gzip_http_version 1.1 ;
  11. #<==压缩版本(默认1.1,前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1, 目前大部分浏览器已经支持GZIP解压,使用默认即可。
  12.  
  13. gzip_comp_level 2 ;
  14. #<==压缩比率。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
  15.  
  16. gzip_types text/plain application/x-javascript text/css application/xml ;
  17. #<==用来指定压缩的类型,"text/html"类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。
  18.  
  19. gzip_vary on ;
  20. #<==vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用Squid缓存 经过Nginx压缩的数据。

1.3.9 配置Nginx expires缓存实现性能优化

简单地说,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除为止。

Nginx expires功能优点

  1. expires可以降低网站的带宽,节约成本。
  2. 加快用户访问网站的速度,提升用户访问体验。
  3. 服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以节约人力成本。
  4. 对于几乎所有的Web服务来说,这是非常重要的功能之一,Apache服务也有此功能。

实践配置

  1. [root@web02 extra]# cat blog.conf
  2. server {
  3. listen 80;
  4. server_name blog.etiantian.org;
  5. server_tokens off;
  6. # 静态请求处理的location
  7. location / {
  8. root html/blog;
  9. index index.php index.html index.htm;
  10. }
  11. # 动态请求处理的location
  12. location ~* .*\.(php|php5)?$ {
  13. root html/blog;
  14. fastcgi_pass 127.0.0.1:9000;
  15. fastcgi_index index.php;
  16. include fastcgi.conf;
  17. }
  18. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  19. {
  20. expires 10y;
  21. root html/blog;
  22. }
  23. location ~ .*\.(js|css)$
  24. {
  25. expires 30d;
  26. root html/blog;
  27. }
  28. }
  29.  
  30. location / {
  31. expires 3650d;
  32. }

企业网站有可能不希望被缓存的内容

  1. 广告图片,用于广告服务,都缓存了就不好控制展示了。
  2. 网站流量统计工具(JS代码),都缓存了流量统计就不准了。
  3. 更新很频繁的文件(google的logo),这个如果按天,缓存效果还是显著的。

1.3.10 配置FastCGI优化

FastCGI Cache资料见:

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

FastCGI常见参数的Nginx配置示例如下:

  1. [root@nginx conf]# cat nginx.conf
  2. worker_processes 4;
  3. worker_cpu_affinity 0001 0010 0100 1000;
  4. worker_rlimit_nofile 65535;
  5. user nginx;
  6. events {
  7. use epoll;
  8. worker_connections 10240;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. sendfile on;
  14. tcp_nopush on;
  15. keepalive_timeout 65;
  16. tcp_nodelay on;
  17. client_header_timeout 15;
  18. client_body_timeout 15;
  19. send_timeout 15;
  20. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  21. '$status $body_bytes_sent "$http_referer" '
  22. '"$http_user_agent" "$http_x_forwarded_for"';
  23. server_tokens off;
  24. fastcgi_connect_timeout 240;
  25. fastcgi_send_timeout 240;
  26. fastcgi_read_timeout 240;
  27. fastcgi_buffer_size 64k;
  28. fastcgi_buffers 4 64k;
  29. fastcgi_busy_buffers_size 128k;
  30. fastcgi_temp_file_write_size 128k;
  31. #fastcgi_temp_path /data/ngx_fcgi_tmp;
  32. fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
  33. #web...............
  34. server {
  35. listen 80;
  36. server_name blog.nmtui.com;
  37. root html/blog;
  38. location / {
  39. root html/blog;
  40. index index.php index.html index.htm;
  41. }
  42. location ~ .*\.php|php5${
  43. fastcgi_pass 127.0.0.1:9000;
  44. fastcgi_index index.php;
  45. include fastcgi.conf;
  46. fastcgi_cache ngx_fcgi_cache;
  47. fastcgi_cache_valid 200 302 1h;
  48. fastcgi_cache_valid 301 1d;
  49. fastcgi_cache_valid any 1m;
  50. fastcgi_cache_min_uses 1;
  51. fastcgi_cache_use_stale error timeout invalid_header http_500;
  52. fastcgi_cache_key http://$host$request_uri;
  53. }
  54. access_log logs/web_blog_access.log main;
  55. }
  56. upstream blog_etiantian{
  57. server 10.0.0.8:8000 weight=1;
  58. }
  59. server {
  60. listen 8000;
  61. server_name blog.nmtui.com;
  62. location / {
  63. proxy_pass http://blog_etiantian;
  64. proxy_set_header Host $host;
  65. proxy_set_header X-Forwarded-For $remote_addr;
  66. }
  67. access_log logs/proxy_blog_access.log main;
  68. }
  69. }

FastCGI常见参数列表说明:

Nginx FastCGI 相关参数

说明

fastcgi_connect_timeout

表示nginx服务器和后端FastCGI服务器连接的超时时间,默认值为60秒,这个参数值通常不要超过75秒,因为建立的连接越多,消耗的资源就越多

fastcgi_send_timeout

设置nginx传输请求到FastCGI服务器的超时时间,这个超时时间不是整个请求的超时时间,而是两个成功请求的之间间隔时间为超时时间,如果这个时间内,FastCGI服务没有收到任何信息,连接将关闭

fastcgi_read_timeout

设置nginx从FastCGI服务器读取响应信息的超时时间苯示连捿建立成功后, nginx等待后端服务器的响应时间,是nginx进入后端的排队之中的等候处理的时间,实际上是读取FastCGI响应成功信息的间隔时间,

fastcgi_buffer_size

这是Nginx FastCGI的缓冲区大小参数,设定用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会包含一个小的响应头部s默认情况下,这个参数的大小等价于_个内存页。不是4k就是8k 根据相应系统平台来决定,也可以更小。

fastcgi_buffers

设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数是,默认值为fastcgi_buffer 8 4k|8k;

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

fastcgi_busy_buffers_size

用于设置系统很忙时可以使用的fastcgi_buffers大小,言方推荐的大小为fastcgi_buffers*2 ;默认值为 fastcgi_busy_buffers_size 8k|16k

fastcgi_temp_file_write_size

FastCGI临时文件的大小,可以设置为128~256KB ; 默认fastcgi_temp_file_write_size 8k|16k;

fastcgi_cache oldboy_nginx

表示开后FastCGI缓存并为其指定一个名称。开后缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开后缓存也可能引起其它问题,要根据具体情况来选择

fastcgi_cache_path

实例:fastcgi_cache_path /data/nginx/cache levels = 2:2 keys_zone = ngx_fcgi_cache:512m inactive = ld max_size=40g; fastcgi_cache缓存目录,可以设置目录前列层级,比如2:2会生成256*256 个子目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容,nginx会直接放入内存,提高访问速度)。inactive表示默认失效时间,max_size表示最多用多少硬盘空间,雲要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path在移到fastcgi_cache_path中去的,所以这个两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放在同_分区。

fastcgi_cache_valid

示例:fastcgi_cache_valid 200 302 lh;

用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存1个小时;

示例:fastcgi_cache_valid 301 Id;

将301应答缓存1天;

fastcgi_cache_min_uses

示例:fastcgi_cache_min_uses 1;  设置清求几次之后晌应将被缓存,1表示一次即被缓存

fastcgi_cache_use_stale

示例:fastcgi_cache_use_stale error timeout invalid_header http_500 定义在哪些情况下使用过期缓存

fastcgi_cache_key

示例:fastcgi_cache_key $request_method://$host$request_uri; fastcgi.cache.key http://$host$request_uri;

定义fastcgi_cache的key ,示例中以请求的URI作为缓存的key,nginx会取这个key的md5作为缓存文件,如果设置了缓存散列目录,nginx会从后往前取梠应的位数作为目录。注意一定要加作为cache key,否则如果先请求的为head 类型,后面的GET清求返回为空。

1.4 日志方面优化

1.4.1 配置Nginx服务相关日志操作

01. 进行日志的切割

  1. [root@clsn ~]# mkdir /server/scripts/ -p
  2. [root@clsn ~]# cd /server/scripts/
  3. [root@clsn scripts]# vim cut_nginx_log.sh
  4. #!/bin/bash
  5. cd /application/nginx/logs &&\
  6. /bin/mv www_access.log www_access_$date +%F -d -1day).log #<==将日志按日期改成前一天的名称
  7. /application/nginx/sbin/nginx -s reload #<==重新加载nginx使得触发重新生成访问日志文件

提示:实际上脚本的功能很简单,就是改名日志,然后加载nginx,重新生成文件记录日志

说明:也可以编辑使用logrotate日志切割服务,进行日志切割

02. 进行日志的选择记录

  1. location ~ .*\.js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF$ {
  2. access_log off;
  3. }

03. 进行日志文件授权

假如日志目录为/app/logs,则授权方法如下:

  1. chown -R root.root /app/logs
  2. chmod -R 700 /app/logs

04. 日志信息尽量汇总备份

  1. [root@clsn ~]# zgrep 456 clsn.tar.gz

1.4.2 查看软件编译时的参数

①. 查看nginx安装时编译了哪些参数

  1. /application/nginx/sbin/nginx -V

②. 查看apache安装时编译了哪些参数

  1. cat /application/apache/build/config.nice
  2. /application/apache/bin/apachectl -V #<--也可查看安装时编译信息,但显示的不全

③. 查看mysql安装时编译了哪些参数

  1. grep CONFIGURE_LINE /application/mysql/bin/mysqlbug

PS:mysql二进制包的安装方式,是无法看到编译参数的,默认为空

④. 查看php安装时编译了哪些参数

  1. /application/php/bin/php -i|grep configure

Nginx软件优化的更多相关文章

  1. Nginx软件优化【转】

    转自 Nginx软件优化 - 惨绿少年 - 博客园 Nginx软件优化 - 惨绿少年 - 博客园 https://www.cnblogs.com/clsn/p/8484559.html 1.1 Ngi ...

  2. Nginx优化之基本安全优化 (隐藏Nginx软件版本号信息,更改源码隐藏Nginx软件名及版本号,更改Nginx服务的默认用户)

    一,隐藏Nginx软件版本号信息 查看版本号 curl -I 192.168.0.220 HTTP/1.1 200 OK Server: nginx/1.6.2 #这里清晰的暴露了Web版本号(1.6 ...

  3. 【实战分享】又拍云 OpenResty / Nginx 服务优化实践

    2018 年 11 月 17 日,由 OpenResty 主办的 OpenResty Con 2018 在杭州举行.本次 OpenResty Con 的主题涉及 OpenResty 的新开源特性.业界 ...

  4. [Nginx] – 性能优化 – 配置文件优化

    Nginx基本安全优化 1.调整参数隐藏Nginx版本号信息     一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例如:Web软件名称及版本号等信 ...

  5. Nginx服务优化详解

    Nginx服务优化详解 1.隐藏Nginx版本信息 编辑主配置文件nginx.conf,在http标签中添加代码 server_tokens off;来隐藏软件版本号. 2.更改Nginx服务启动的默 ...

  6. Nginx服务优化

    1.1Nginx.conf配置文件基本参数优化 1.1.1  隐藏nginx header内版本号信息 一些特定的系统及服务漏洞一般都和特定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称 ...

  7. 企业级web nginx服务优化

    1.1)隐藏nginx header 内版本号信息 [root@aliyun ~]# vi /application/nginx/conf/nginx.conf http{ …… server_tok ...

  8. Nginx企业级优化

    Nginx企业级优化 一.隐藏版本号信息 安装软件前修改,源码包中的版本信息 #切换到源码包目录[root@localhost ~]# cd /usr/src/nginx-1.15.9/[root@l ...

  9. Nginx基础优化

    Nginx基础优化 1.隐藏nginx header版本号 1.1查看版本号 [root@Nginx ~]# curl -I http://www.yunwei.cn HTTP/1.1 200 OK ...

随机推荐

  1. PHP 日期时间类 Carbon 的常见用法

    Carbon 继承了 PHP DateTime 类,所以 DateTime 类的方法同样适用于 Carbon 类. 初始化一个日期 use Carbon\Carbon; $today = new Ca ...

  2. HTTP协议特点

    1 HTTP协议特点      1)客户端->服务端(请求request)有三部份         a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请 ...

  3. 《剑指offer》-判断对称二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 思路上还是广度优先搜索(BFS)来做的.BFS是依托于STL的queue作为容 ...

  4. 【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用

    无向图满足约束条件的路径 •[目的]:掌握深度优先遍历算法在求解图路径搜索问题的应用 [内容]:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径:  (1)给定起点u和终点v.  ( ...

  5. 《JavaScript 高级程序设计》第四章:变量、作用域和内存问题

    目录 变量的引用 执行环境及作用域 作用域链延长 块级作用域 垃圾回收机制 变量的引用 当一个变量保存了基本数据类型时,此时对于变量的操作(赋值,运算)就是操作这个基本数据的本身,就算是赋值操作,赋值 ...

  6. hdu 1181 以b开头m结尾的咒语 (DFS)

    咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体现在要将一个B(ball)变成一个M(Mouse),比如 "big-got-them". Sample Inp ...

  7. #6【bzoj4321】queue2 dp

    题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行:  现在想知道,存在多少方案满足沙茶们如此不苛刻的条件.  ...

  8. CSS3滚动条美化,CSS3滚动条皮肤

    CSS3 -webkit-scrollbar滚动条皮肤美化实现,利用-webkit-scrollbar,-webkit-scrollbar-track,-webkit-scrollbar-thumb这 ...

  9. 【noip模拟赛5】水流

    描述 全球气候变暖,小镇A面临水灾.于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里.小镇可以认为是N * M的矩阵.矩阵里的每个单元格 ...

  10. 最全Python爬虫总结(转载)

    [html] view plain copy 最近总是要爬取一些东西,索性就把Python爬虫的相关内容都总结起来了,自己多动手还是好. (1)普通的内容爬取(2)保存爬取的图片/视频和文件和网页(3 ...