nginx性能优化面试题_nginx高并发优化

nginx性能优化面试题_nginx高并发优化nginx的优化1.gzip压缩优化2.expires缓存有还3.网络IO事件模型优化4.隐藏软件名称和版本号5.防盗链优化6.禁止恶意域名解析7.禁止通过IP地址访问网站8.HTTP请求方法优化9.防DOS攻击单IP并发连接的控制,与连接速率控制10.严格设置web站点目录的权限11….

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

nginx的优化

复制代码

1.    gzip压缩优化
2.    expires缓存有还
3.    网络IO事件模型优化
4.    隐藏软件名称和版本号
5.    防盗链优化
6.    禁止恶意域名解析
7.    禁止通过IP地址访问网站
8.    HTTP请求方法优化
9.    防DOS攻击单IP并发连接的控制,与连接速率控制
10.    严格设置web站点目录的权限
11.    将nginx进程以及站点运行于监牢模式
12.    通过robot协议以及HTTP_USER_AGENT防爬虫优化
13.    配置错误页面根据错误码指定网页反馈给用户
14.    nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限
15.    限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件
16.    FastCGI参数buffer和cache配置文件的优化
17.    php.ini和php-fpm.conf配置文件的优化
18.    有关web服务的Linux内核方面深度优化(网络连接、IO、内存等)
19.    nginx加密传输优化(SSL)
20.    web服务器磁盘挂载及网络文件系统的优化
21.    使用nginx cache

复制代码

1、基本安全优化

1.1  隐藏版本信息

    一般来说,软件的漏洞都和版本相关,所以我们要隐藏或消除web服务对访问用户显示的各种敏感信息。

复制代码

 1 [root@db01 rpm]# curl -I 10.0.0.8
 2 HTTP/1.1 401 Unauthorized
 3 Server: nginx                                          #隐藏版本号
 4 Date: Thu, 21 Jul 2016 03:23:38 GMT
 5 Content-Type: text/html
 6 Content-Length: 188
 7 Connection: keep-alive
 8 WWW-Authenticate: Basic realm="oldboy training"
 9 过程:
10 vim /application/nginx/conf/nginx.conf
11 在http模块下加入:
12 server_tokens off;
13 /application/nginx/sbin/nginx -t
14 /application/nginx/sbin/nginx -s reload

复制代码

1.2  隐藏nginx要修改源代码

nginx性能优化面试题_nginx高并发优化

要修改内容的路径:

第一路径:

1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行
2 #define NGINX_VERSION  "1.6.2" 修改为想要的版本号如2.4.3
3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。

第二路径

1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行
2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic
3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c

第三路径

/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行
"<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
"<hr><center>OWS</center>" CRLF

然后重新编译

1.3  更改nginx服务的默认用户

第一种方法:

    直接更改配置文件nginx.conf.default参数,将默认的#user nobody;改为user nginx.nginx;

第二种方法:

  直接在编译nginx的时候指定用户和用户组命令如下:

  ./configure –prefix=/application/nginx-1.6.3 –user=nginx –group=nginx –with-http_ssl_module –with-http_stub_status_module

1.4  降权启动nginx

1 useradd inca
2 cd /home/inca/
3 mkdir conf logs www
4 echo inca >www/index.html
5 chown -R inca.inca *
6 ln -s /application/nginx/conf/mime.types conf/mime.types  #mime.types媒体类型文件

egrep -v “#|^$” /application/nginx/conf/nginx.conf.default >conf/nginx.conf

nginx.conf配置文件

复制代码

worker_processes  1;
error_log  /home/inca/logs/error.log;
pid /home/inca/logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                 '$status $body_bytes_sent "$http_referer" '
                                 '"$http_user_agent" "$http_x_forwarded_for"';
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       8080;
        server_name  localhost;
        location / {
            root   /home/inca/www;
            index  index.html index.htm;
            }
            access_log /home/inca/logs/access.log main;
}
}

复制代码

  su – inca -c “/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf”   #启动nginx服务

 重点强调:

  1.nginx.conf里面的相关路径都要更改

  2.普通用户的端口问题

2、  根据参数优化nginx服务性能

2.1  优化nginx进程个数的策略

  在高并发、高访问量的web服务场景,需要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求。

  worker_processes  1;一般调整到与CPU的颗数相同

  (1)查看LInux可查看CPU个数及总核数

grep processor /proc/cpuinfo|wc -l

  (2)查看CPU总颗数

grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l

  (3)通过执行top命令,然后按数字1,即可显示所有的CPU核数

top  按1键就会显示第一个的信息

Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0

2.2   优化绑定不同的nginx进程到不同的CPU上

     默认情况下,nginx的进程跑在某一个CPU或CPU的某一个核上,导致nginx进程使用硬件的资源不均,本节的优化是不同的nginx进程给不同的CPU处理,充分有效的利用有效的硬件资源

  四核cpu配置

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

  双核配置

worker_processes    2;
worker_cpu_affinity 0101 1010;

  还有一个命令taskset -c用来分配服务给CPU

2.3 nginx事件处理模型优化

  nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。 
  要根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.5的linux,因此将nginx的事件处理模型调整为epool模型。

events {
worker_connections  1024;
use epoll;
}

官方说明:在不指定事件处理模型时,nginx默认会自动的选择最佳的事件处理模型服务

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

参数语法:worker_connections number 
默认配置:worker_connections 512 
放置位置:events 标签  

events {
    worker_connections  1024;    #一个worker进程的并发
}

总并发= worker_processes* worker_connections

2.5 配置nginx worker进程最大打开文件数

参数语法:worker_rlimit_nofile number 
放置位置:主标签段 
说明:作用是改变worker processes能打开的最大文件数

worker_rlimit_nofile 65535;

这各参数受系统文件的最大打开数限制,解决方法:

[root@admin nginx]# cat /proc/sys/fs/file-max
8192

文件系统最大可打开文件数

[root@admin nginx]# ulimit -n
1024

程序限制只能打开1024个文件

使用# ulimit -n 8192调整一下

或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效)

2.6 开启高效文件传输模式

设置参数 sendfile on;

sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。

http {
  sendfile        on;     #放在http,server,location都可以
}

设置参数tcp_nopush;

激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量(只有sendfile on开启才生效)

复制代码

例:
    sendfile   on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    server_names_hash_bucket_size 128;
    server_names_hash_max_size 512;
    keepalive_timeout  65;
    client_header_timeout 15s;
    client_body_timeout 15s;
    send_timeout 60s;

复制代码

2.7 FastCGI相关参数调优

    fastcgi参数是配合nginx向后请求PHP动态引擎服务的相关参数。

 nginx性能优化面试题_nginx高并发优化

 

 

复制代码

fastcgi_connect_timeout 240;       
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;

复制代码

 

 nginx性能优化面试题_nginx高并发优化

 

2.8 配置nginx gzip压缩实现性能优化

  nginx压缩功能的介绍:

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

2.8.1 压缩的优点:

  提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验就提升了

  节约网站带宽成本:由于数据时压缩传输的,因此,会消耗一些cpu资源

2.8.2 压缩的对象:

  纯文本内容压缩比很高,因此,纯文本的内容最好要压缩

  被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大

  图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源

2.8.3 参数介绍及配置说明:

gzip on;                            #表示开启压缩功能

gzip_min_length  1k;                  #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大

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

gzip_http_version 1.1;                #压缩版本

gzip_comp_level 9;                  #压缩比率

gzip_types  text/css text/xml application/javascript;  #指定压缩的类型

gzip_vary on;                   #vary header支持

完美配置:

复制代码

nginx.conf  http模块
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 32k;
  gzip_http_version 1.1;
  gzip_comp_level 9;
  gzip_types  text/css text/xml application/javascript;
  gzip_vary on;

复制代码

2.9 nginx expires功能

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

 nginx性能优化面试题_nginx高并发优化

 

2.9.1 expires作用和优点:

   expires可以降低网站的带宽,节约成本

  加快用户访问网站的速度,提升了用户访问体验

  服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本

  几乎对于所有web服务来说,这是非常重要的功能之一,apache服务也有此功能。

2.9.2 nginx expires 配置详解:

## Add expires header according to URI(path or dir).

location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    expires 360d;
}

nginx性能优化面试题_nginx高并发优化

2.9.3 expire缺点及解决办法:

  当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?

  第一:对于经常需要的变动图片等文件,可以缩短对象缓存时间,例如,百度、谷歌等网站的首页图片经常会换成一些节日的图,这里可以将缓存期修改为1天

  第二:当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序)

  对于网站的图片、附件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是一个新的图片名了

  网站改版升级会修改JS、CSS元素,若改版的时候对这些元素改了名,会使得前端的CDN以及用户端需要重新缓存内容

3.   nginx日志的优化

3.1 编写脚本实现日志轮询

  编写脚本实现nginx access日志轮询

  用户咋请求一个软件时,绝大多数软件都会记录用户的访问情况,nginx软件目前没有类似apache通过cronolog或者rotatelog对日志分隔处理的功能,但是,运维人员可以通过利用脚本开发、nginx的信号控制功能或reload重新加载,来实现日志的自动切割、轮询。

  操作步骤:

    写一个定时任务

mv www_access.log www_access_$(date +F -d -1day).log
/applocation/nginx/sbin/nginx -s reload

3.2 不记录不需要的日志

     在实际工作中,对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的,而且日志写入的太频繁会消耗磁盘i/o,降低服务的性能

具体配制方法:

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

3.3访问日志的权限设置

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

  chown -R root.root /app/logs
  chmod -R 600 /app/logs

  不需要在日志目录上给nginx用户读写或者读写许可,很多人都没有注意这个问题,这就称为了安全隐患。

4.   nginx站点目录及文件URL访问控制

4.1 根据扩展名限制程序和文件访问

  web2.0时代,绝大多数网站都是以用户为中心的,这些产品有一些共同点,就是不允许用户发布内容到服务器,还允许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。

  下面将利用nginx配置禁止访问上传资源目录下的PHP,SHELL,PERL,PYTHON程序文件,这样就算是用户上传了木马文件也没办法执行

复制代码

 1        location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$
 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            }    

复制代码

  对于上述目录的限制必须写在nginx处理PHP服务配置的前面

4.2 禁止访问指定目录下的所有文件和目录

配置禁止访问指定的单个或多个目录

复制代码

location ~ ^/(static)/ {
        deny all;
}

 

location ~ ^/static {
        deny all;
}

复制代码

禁止访问目录并且返回代码404

复制代码

server {

        listen       80;

        server_name  www.etiantian.org etiantian.org;

            root   /data0/www/www;

            index  index.html index.htm;

            access_log  /app/logs/www_access.log  commonlog;

            location /admin/ { return 404; }

            location /templates/ { return 403; }

}

复制代码

4.3 限制网站来源的IP访问

使用ngx_http_access_module限制网站来源IP访问。

范例1:禁止外界访问,但允许某个IP访问该目录

复制代码

location ~ ^/oldboy/ {

       allow 202.111.12.211;

       deny all;

}

复制代码

范例2:限制及指定IP或IP段访问。

复制代码

location / {

       deny 192.168.1.1;

       allow 192.168.1.0/24;

       allow 10.1.1.0/16;

       deny all;

}

复制代码

4.4 配置nginx禁止非法域名解析访问企业网站

问题:nginx如何防止用户IP访问网站(恶意域名解析,相当于直接使用IP访问网站)

方法1:直接报错,用户体验不好

复制代码

server {

listen 80 default_server;

server_name _;

return 501;

}

复制代码

方法2:通过301跳转到主页

复制代码

server {

listen 80 default_server;

server_name _;

rewrite ^(.*) http//:blog.etiantian.org/$1 permanent;

}

复制代码

 

5.   nginx图片防盗链解决方案。

简单的说,没有经过你的允许在自己网站嵌入你的图片。

nginx性能优化面试题_nginx高并发优化

 

nginx性能优化面试题_nginx高并发优化

  

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

  1. 根据HTTP referer实现防盗链
  2. 根据cookie防盗链

 nginx性能优化面试题_nginx高并发优化

5.2 防盗链实战

被盗链的网站配置

复制代码

 1 #Preventing hot linking of images and other file types
 2 
 3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
 4 
 5     valid_referers none blocked *.etiantian.org etiantian.org;
 6 
 7     if ($invalid_referer) {
 8 
 9         rewrite ^/ http://bbs.etiantian.org/img/nolink.gif;
10 
11     }
12 
13     root html/www;
14 
15 }

复制代码

6.   nginx错误页面的优雅显示

范例:当出现403错误会跳转到403.html页面

error_page  403  /403.html;

7.   nginx站点目录文件及目录权限优化

 

 nginx性能优化面试题_nginx高并发优化

 

8.  部署网站程序权限设置

(1)wordpress站点目录权限设置

方案1:推荐方案

目录:755

文件:644

所有者:root

图片及上传目录设置所有者为www

复制代码

cd /application/apache/html/

chown -R root.root blog

find ./blog/ -type f|xargs chmod 644

find ./blog/ -type d|xargs chmod 755

复制代码

9.   nginx防爬虫优化

配置

复制代码

if  ($http_user_agent   ~*  LWP:Simple|BBBike|wget)  {

return  403 ;

rewrite ^(.*) http://blog.etiantian.org/$1 permanent;

}

复制代码

 

10.   利用nginx限制HTTP的请求方法

配置:

if ($request_method  !~  ^(GET|HEAD|POST)$ ) {

return  501;

}

配置上传服务器限制HTTP的GET的配置

复制代码

#Only allow these request methods ##

if ($request_method ~*(GET)$ ) {

   return 501;

}

复制代码

 

11.   使用CDN做网站内容加速

cdn特点

  本地Cache加速 提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性 

  镜像服务 消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。 

  远程加速 远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度 

  带宽优化 自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能。 

  集群抗攻击 广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种D.D.o.S攻击对网站的影响,同时保证较好的服务质量 。

12.  使用普通用户启动Nginx(监牢模式)

解决方案 

  给Nginx服务降权,用普通用户跑Nginx服务,给开发及运维设置普通账号 

  开发人员使用普通账号即可管理nginx服务及站点下的程序和日志 

  责任划分:网络问题:运维责任,网站打不开开发责任。(共同承担)

实战配置:

复制代码

useradd inca

cd /home/inca

mkdir conf www log

echo inca >www/index.html

复制代码

修改配置文件

error_log /home/inca/log/error.log

pid /home/inca/log/nginx.pid

13. 控制Nginx并发连接数量

  ngx_http_limit_conn_module这个模块用于限制每个定义key值得连接数,特别是单个TP的连接数。 
  不是所有的连接数都会被计算。一个符合计数要求的连接是整个请求头已经被读取的连接。

  控制Nginx并发连接数量参数的说明 
  1)limit_conn_zone参数: 
    语法:limit_conn_zone key zone=name:size; 
    上下文:http 
    用于设置共享内存区域,key可以是字符串、Nginx自带变量或前两个组合。name为内存区域的名称,size为内存区域的大小。

  2)limit_conn参数 
    语法:limit_conn zone number; 
    上下文:http、server、location 
    用于指定key设置最大连接数。当超时最大连接数时,服务器会返回503报错。

14. 控制客户端请求Nginx的速率

  ngx_http_limit_req_module模块用于限制每个IP访问每个定义key的请求速率。

  limit_req_zone参数说明如下。 
    语法:limit_req_zone key zone=name:size rate=rate; 
    上下文:http 
    用于设置共享内存区域,key可以是字符串,Nginx自带变量或前两个组合。name为内存区域的名称,size为内存区域的大小,rate为速率,单位为r/s,每秒一个请求。 
  limit_req参数说明如下: 
    语法:limit_req zone=name [burst-number] [nobelay] 
    上下文:http、server、location 
    这里运用了令牌桶原理,burst=num,一个有num快令牌,令牌发完后,多出来的那些请求就会返回503。 
  nodelay默认在不超过burst值得前提下会排队等待处理,如果使用此参数,就会处理完num+1次请求,剩余的请求为超时,返回503。

https://www.cnblogs.com/dazhidacheng/p/7772451.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/175608.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号