Nginx Web服务优化

《老男孩Linux运维》笔记




隐藏Nginx软件版本号

一般来说,软件的漏洞都和版本有关。因此要尽量隐藏对访问用户显示各类敏感信息,这样恶意的用户就很难猜到他攻击的服务器所用的是否有特定漏洞的软件,从而加强Web服务安全。

编辑nginx.conf配置文件,增加参数:

http {

    server_tokens off | on;

}

server_tokens默认是开启的,且可放置于 http,server,location。



更改Nginx服务的默认用户

1,直接修改配置文件nginx.conf:

user nginx;

2,直接在编译Nginx软件时指定编译的用户和组:

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



优化Nginx进程对应的配置

修改nginx.conf配置文件:

worker_process 4;

#建议设置为CPU核数,高并发场合可以考虑设置成 核数*2

Nginx Web服务优化_第1张图片
nginx

上述参数调整的是Nginx服务的worker进程数,Nginx有Master进程和worker进程。Master为管理进程,真正处理用户的是worker进程。

cat /proc/cpuinfo | grep processor | wc -l    #查看CPU总核数;

cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l    #查看CPU个数;

也可使用 top 命令,按 1 即可显示所有CPU核数;

Nginx Web服务优化_第2张图片
top



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

默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均。所以,尽可能地分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。

四核CPU配置参考:

vi /etc/nginx/nginx.conf

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;    #CPU亲和力参数



Nginx事件处理模型优化

Nginx的连接处理机制在不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型,在FreeBSD中使用kqueue的I/O多路复用模型,在solaris中使用/dev/poll方式的I/O多路复用模型,在Windows中使用的是icop。

具体配置:

events {

    use epoll;    #use是一个时间模块指令,用来指定Nginx的工作模式,对于Linux内核,推荐使用epoll工作模式

}

#对于使用连接进程的方法,通常不需要进行任何设置,Nginx会自动选择最有效的方法。



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

这个控制连接的参数为worker_connections,它的值要根据服务器性能和程序的内存使用量来制定。

events {

    worker_connections 1024;    #定义每个进程(process)的最大连接数,这个连接包括了所有连接,如代理服务器连接、客户端的连接、实际的并发连接

}

#Nginx总并发连接 == worker * worker_connections



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

events {

worker_rlimit_nofile  65535;    #最大打开文件数,可设置为系统优化后的ulimit -HSn的结果

}



开启高效文件传输模式

设置参数:sendfile

sendfile()是作用与两个文件描述符之间的数据拷贝,这个拷贝实在内核之中的,被称为零拷贝。sendfile()比read和write函数要高效很多,因为write和read函数要把数据拷贝到应用层再进行操作。

sendfile  on|off

context: http,server,location,if in location

设置参数:tcp_nopush

激活或禁用Linux上的TCP_CORK socket选项,仅当开启sendfile生效。允许把 http response和文件的开始部分放在一个文件里发布,其积极作用是减少网络报文段的数量。

tcp_nopush on;

context: http,server,location



优化Nginx连接参数,调整连接超时时间

连接超时参数:Keepalive_timeout 

keep-alive可以使客户端到服务器端已经建立的连接一致工作不退出,当服务器有持续请求时,keep-alive会使用已经建立的连接提供服务,从而避免服务器充县建立新连接请求处理。

keepalive_timeout 60;

context:http,server,location

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

连接超时的作用:

将无用的连接设置为尽快超时,可保护系统资源(CPU、内存、磁盘);

连接很多时,及时断掉那些已经建立好但又长时间不做事的连接,以减少其占用的服务器资源。因为服务器维护连接也是消耗资源的;

黑客和恶意用户攻击网站,也会不断地和服务器建立多个连接,消耗连接数但啥也不干,大量消耗服务器的资源,此时就应该及时断掉这些恶意占用资源的连接;

LNMP环境中,如果用户请求了动态服务,则Nginx就会建立连接,请求FastCGI服务以及后端的MySQL服务,此时这个Nginx连接就要设置一个超时时间,在用户容忍的时间内返回数据,或者再多等一会后端服务返回数据,具体策略根据具体业务进行具体分析;

后端的FastCGI服务及MySQL服务也有对连接的超时控制。

设置参数:tcp_nodelay

默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能。但是,在每次只发送很少字节的业务场景中,使用tcp_nodelay功能,等待时间会比较长。

tcp_nodelay on;

context:http,server,location

设置参数:client_header_timeout

读取客户端请求头数据的超时时间,如果超过这个时间,客户端还没有发送完整的header数据,服务器端将返回“Request time out(408)”错误。

client_header_timeout 20;

context:http,server

设置参数:client_body_timeout

读取客户端请求主体的超时时间,如果在这个超时时间内,客户端没有发送任何数据,Nginx将返回“Request time out(408)”错误。

client_body_timeout 60;

context:http,server,location

设置参数:send_timeout

指定响应客户端的超时时间,为握手后的一个超时。如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

send_timeout 60;

context:http,server,location



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

参数:client_max_body_size

设置为 0 表示禁止检查客户端请求主体大小

client_max_body_size 8m;

context:http,server,location



FastCGI相关参数调优(配合PHP引擎动态服务)

FastCGI参数是配合Nginx向后请求PHP动态引擎服务的相关参数,这里指的是Nginx中的配置参数。

Nginx FastCGI常见参数:

请参考Module ngx_http_fastcgi_module(https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html)

fastcgi_pass    #给FastCGI服务器设置地址;

fastcgi_index    #设置一个将在 $fastcgi_scripts_name 变量结尾的URI之后添加的文件名;

fastcgi_param    #设置一个应该传递给FastCGI服务器的参数,当且仅当fastcgi_param在当前级别上没有定义指令时,这些指令将从上一级继承;

fastcgi_next_upsteam    #指定在哪种情况下将请求传递给下一个服务器;

fastcgi_connect_timeout    #表示Nginx服务器和后端FastCGI服务器连接的超时时间,默认值为60秒,这个参数通常不要超过75秒;

fastcgi_send_timeout    #设置Nginx允许FastCGI服务器端返回数据的超时时间,即在规定时间之内后端服务器必须传完所有的数据。否则,Nginx将断开这个连接;

fastcgi_read_timeout    #设置Nginx从FastCGI服务器端读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间,是Nginx已经进入后端的排队之中等候处理的时间;

fastcgi_buffer_size    #这是Nginx FastCGI的缓冲区大小参数,设定用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小,这里的第一部分通常会包含一个小的响应头部;

fastcgi_buffers    #设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量;

proxy_busy_buffers_size    #用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐大小为proxy_buffers * 2;

fastcgi_busy_buffers_size    #用于设置系统很忙时可以使用的fastcgi_buffers大小,官方推荐为 fastcgi_buffers * 2;

fastcgi_temp_file_write_size    #FastCGI临时文件大小;

fastcgi_cache cachename_nginx    #表示开启FastCGI缓存并为其指定一个名称;

fastcgi_cache_path    #fastcgi_cache缓存目录;

fastcgi_cache_valid    #用来指定应答代码的缓存时间;

fastcgi_cache_min_uses    #设置请求几次之后响应将被缓存;

fastcgi_cache_use_stale    #定义在哪些情况下使用过期缓存;

fastcgi_cache_key    #定义fastcgi_cache的key;

Nginx Web服务优化_第3张图片
依据HTTP原理及FastCGI原理解释FastCGI参数优化



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

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

Nginx gzip压缩的优点:

提升网站用户体验;

节约网站带宽成本;

压缩对象:

纯文本内容压缩比很高,如 html, js, css, xml等;

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

图片、媒体等文件尽量不要压缩,因为这些文件大都经过压缩,再压缩很可能不会减小很多,或有可能增大,同时还要消耗系统资源;

参数介绍及配置:

gzip on;#压缩功能

gzip_min_length  1K;#允许压缩的页面最小字节数

gzip_buffers  4 16K;#申请4个单位为16K的内存作为压缩结果流缓存

gzip_http_version  1.1;#http协议版本

gzip_comp_level  5;#指定压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度最快,处理最慢

gzip_types  text/html text/css;#指定压缩类型,对应文件类型参考mime.types

gzip_vary on;#vary header支持

gzip效果查看:

Content-Encoding: gzip



Nginx expires缓存

expires 期限,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间。

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

Nginx expires功能优点:

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

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

服务器请求降低,服务器压力就减轻了,成本也会降低;


Nginx expires配置

1,根据文件扩展名进行判断:

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

{

    expires  2y;#当用户访问上述扩展名文件时,缓存相应的时间

}

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

{

expires 10d;

}


2,根据URI中的路径(目录)进行判断:

location ~ ^/(images|static|media)/ {

    expires 50d;

}


Nginx expires效果检查:

Expires: 缓存过期时间

Cache-Control:缓存总时间


Nginx expires功能缺点及解决方法:

当网站数据更新了,此时用户端看到的可能还是旧的已经缓存的内容。

对于经常需要变动的文件,可缩短对象缓存时间;如百度首页图片根据一些节日换成节日相对应的图片,所以设置这些图片缓存期为一天;

当网站改版或更新时,可以在服务器将缓存的对象改名;


网站可能不希望被缓存的内容:

广告图片,用于广告服务,都缓存了就不好控制展示了;
网站流量统计工具(js代码),缓存了统计就不准了;




Nginx日志相关优化与安全

现在Nginx 日志已经自动轮询了。

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

配置日志切割脚本:

vim cut_nginx_log.sh

cd /path/log/nginx && mv access.log access_$(date +%F -d -1days).log

tar -czf access_xx.gz access.xx.log

nginx -s reload

crontab -e

00 00 * * * /bin/sh /path/cut_nginx_log.sh


不记录不需要的访问日志

日志写入太频繁会消耗大量磁盘I/O,降低服务性能。

location ~ .*\.(js|jpg|css|png|gif)$ {

access_log off;

}


访问日志权限

不需要在日志目录上给Nginx用户读或写许可,很多人没注意这个问题,把权限直接给了Nginx用户,这就成了安全隐患。

chown -R root:root  /path/log/nginx

chmod -R 700 /path/log/nginx

我以前一直也是认为应该 nginx:nginx  /path/log/nginx,但今天看到这,去测试了上述方法,可以写入日志。查看nginx运行,原来nginx master process的UID是root,难怪难怪!

root      68300      1  0 16:15 ?      00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf



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

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

利用Nginx配置禁止访问上传资源目录下的PHP、Shell、Perl、Python程序文件,这样用户即使上传了木马文件也没法执行,从而加强了网站的安全。

范例1,配置Nginx,禁止解析指定目录下的指定程序:

location ~ ^/images/.*\.(php|py|sh|pl)$ 

{

  deny all;

}

location ~ ^/static/.*\.(php|py|pl|sh)$

{

  deny all;

}


对上述目录的限制必须放在Nginx处理PHP服务配置的前面:

#location ~ \.php$ {

#    root          html;

#    fastcgi_pass  127.0.0.1:9000;

#    fastcgi_index  index.php;

#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

#    include        fastcgi_params;

#}


范例2,Nginx下配置禁止访问 *.txt 和 *.doc文件:

location ~* \.(txt|doc)$

{

   if (-f  $request_filename) {

      root /var/www;

      #rewrite...  也可以重定向到某个URL

      break;

    }

}

location ~* \.(txt|doc)$

  root /var/www;

  deny all;

}



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

范例1,配置禁止访问指定的单个或多个目录:

location ~  ^/(static)/ {

deny all;

}

location ~ ^/static  {

deny all;

}


禁止访问多个目录:

location ~ ^/(static | js ) {

   deny all;

}


范例2,禁止访问目录并返回指定HTTP状态码:

location  /admin/ {

return 404;

}

location /templates/ {

return 403;

}



限制网站来源IP访问

范例1,禁止某目录让外界访问,但允许某IP访问该目录,并支持PHP解析:

location ~ ^/secret/ {

allow 222.222.222.222;

deny all;

}

location ~ .*\.php$ {

 fastcgi_pass  127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

include        fastcgi_params;

}


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

location / {

deny 192.168.10.10;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

deny all;

}


Nginx做反向代理的时候可以限制客户端IP

1,使用 if 来控制:

if ($remote_addr = 10.0.0.7) {

return 403;

}

if ( $remote_addr = 11.11.11.11 ) {

set $allow_access_root 'true';

}


2,利用deny和allow只允许IP访问:

location / {

root /var/www;

index index.php index.html;

allow 22.22.22.22;

deny all;

}


方法3,只拒绝某些IP访问:

location  / {

root /var/www;

index index.html;

deny 11.11.11.11;

allow all;

}


注意:

1,deny一定要加一个IP,否则会直接跳转403,不在往下执行,如果403默认页实在同一域名下,会造成死循环访问;

2,对于allow的IP段,从允许访问的段位从小到大排列,如 127.0.0.0/24后面才是10.10.0.0/16;

3,以deny all结尾,表示除了上面允许的,其他都禁止;



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

Nginx如何防止用户IP访问网站,或恶意域名解析?

方法1,让使用IP访问网站的用户,或恶意解析域名的用户,收到501错误:

server {

listen 80 default_server;

server_name _;

return 501;

}

#配置文件里面没有写的虚拟主机都调到 default_server。


或重定向:

server {

listen 80 default_server;

server_name _;

rewrite ^(.*)  http://www.baidu.com permanent;

}


发现域名恶意解析到服务器IP,在server标签下添加以下代码即可:

if ($host !~ ^www/\.zhang21/\.com$) {

rewrite ^(.*) http://www.baidu.com permanet;

}


default_server举例:

利用default_server,将网站所有请求定向到维护页面。

server {

    listen 80 default_server;

    server_name _;

    root /var/www;


    location / {

        rewrite ^(.*) /errot.html break;

    }


vim /var/www/errot.html

网站维护中!




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

什么是资源盗链

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

这一举动不仅浪费了调用资源网站的网络流量,还造成其他网站的带宽及服务压力吃紧。


网站资源被盗链,出现严重问题

某公司CDN源站流量没有变化,但CDN加速那边流量超了很多。这么大异常流量,全都是钱呀!

如何处理?

1,对IDC及CDN带宽做监控报警;

2,经常查看网站流量,关注流量变化,关注异常流量;

3,对访问日志作分析,迅速定位异常流量



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

根据HTTP referer 实现防盗链

在HTTP 协议中,有一个表头字段叫 referer,使用URL格式来表示是哪里的链接用了当前网页的资源。

通过referer 可以检测访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上进行阻止。

HTTP referer 是header的一部分,当浏览器向web服务器发送请求时,一般会带上 referer,高速服务器我是从哪个页面过来的,服务器借此获得一些信息用于处理。

根据cookie防盗链

通过加密技术变换访问路径实现盗链



Nginx Web服务实现防盗链

利用 referer,针对指定扩展名进行 rewrite或其他操作

location ~*  \. (.jpg|gif|png|wma|wmv|mp3|zip|rar) {

valid_referers none blocked *.zhang21.com zhang21.com;

if ($invalid_referer) {

    rewrite xxxx;

  }

}

要根据实际情况进行域名防盗链设置!


利用referer,针对站点目录过滤并返回错误码

location /images {

  root  /var/www;

  valid_referers none blocked *.zhang21.com zhang21.com;

  if ($invalid_referer) {

    return 403;

  }

}


NginxHttpAccessKeyModule实现防盗链介绍

如果download目录下有一个file.rar文件,那对应的URI就是http://www.abc.com/download/file.rar,而使用了ngx_http_accesskey_module模块后就变成了http://www.abc.com/download/file.rar?key=xxxxxxxxxxx。只有正确地给定了key的值,才能下载download目录下的file.rar文件,而且key的值与用户的IP相关,这样可以避免被盗连。


在产品设计上解决盗链方案

可以为图片等增加水印。

通过查看Nginx日志格式中的 $http_referer 变量,查看被盗链情况。在对应的日志文件中查看该变量的值,可以知晓 http_referer的信息。




Nginx错误页面的优雅显示

常见HTTP状态码此处略过!


为什么要配置错误页面优雅显示?

我们可以将404、403等错误信息重定向到网站首页或其他指定的页面,提升网站的用户访问体验!

自定义的错误码优雅页面:

location / {

xxxxxxx;

error_page 403 /403.html;    #当出现403错误时跳转到优化后的页面

error_page 500 503 504 /50x.html;

location = /50x.html {

    root /xxx/xxx/50x.html;    #将50x页面放到本地单独目录下进行显示

    }

error_page 404 =200 /404200.jpg;    #改变状态码并指定显示内容

error_page 502 http://www.baidu.com;    #错误码重定向;

}


将错误状态码重定向到一个location:

location / {

  error_page 404 = @zhang;

}

location @zhang {

proxy_pass http://www.baidu.com;

}




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

单机LNMP环境目录权限严格控制措施

为了保证网站不受木马入侵,所有站点的目录的用户和组都为root,所有的目录权限是是755,所有文件权限是644。

虽然这样的权限可以防止黑客上传修改站点文件,但这样合法用户便也没有了上传权限。

比较好的解决方法是将用户上传的文件等服务分离,这样就可以进行安全授权了。不同的服务所在目录的权限依据业务功能而不同!

严格控制Nginx目录的访问才能降低网站被入侵的风险!


Nginx反爬虫优化

robots.txt机器人协议介绍

Robots协议(也称为爬虫协议、机器人协议),全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎那些页面可以抓取,那些页面不能抓取。

robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。

robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。

robots.txt语法

User-Agent:*

Allow:

Disallow:

来看一下的robots.txt:

Nginx Web服务优化_第4张图片
www.jianshu.com/robots.txt


Nginx反爬虫优化配置

阻止下载协议代理:

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

return 403;

}


测试禁止不同的浏览器软件访问:

if ($http_user_agent ~* “Firefox|MSIE”){

rewrite ^(.*) http://www.baidu.com;#如果浏览器为Firefox或IE,则跳转

}



利用Nginx限制HTTP的请求方法

可以通过Nginx限制HTTP请求的方法来达到提升服务器安全的目的。

如,让HTTP只能使用GET、HEAD和POST方法的配置:

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

return 501;

}

还可以加一层 location,更具体地限制文件名。



使用CDN做网站内容加速

什么是CDN?

CDN的全称是 Content Delivery Network,中文意思是内容分发网络。

简单地讲,通过现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的Cache服务器内,通过智能DNS负载均衡技术,判断用户的来源,让用户就近使用与服务器相同线路的带宽访问Cache服务器,取得所需的内容。

例如,北京电信用户访问北京电信Cache服务器上的内容,四川网通用户访问成都网通Cache服务器上的内容。这样可以有效减少数据在网络上传输的时间,提高访问速度。

CDN是一套全国或全球的风不是缓存集群,其实质是通过职能DNS判断用户的来源地域及上网线路,为用户选择一个最接近用户地域,以及和用户上网线路相同的服务器节点。因为低于近,线路相同,所以可以大幅度提升用户浏览网站的体验。


CDN的价值:

省钱;

提升网站的用户体验;

可以阻挡大部分流量攻击,如DDOS;



CDN的特点

CDN就是一个具备根据用户区域和线路智能调度的风不是内存缓存集群。特点如下:

通过服务器内存缓存网站数据,提高了企业站点(尤其是含有大量图片、视频等的站点)的访问速度,并大大提高企业站点的稳定性;

用户根据智能DNS技术自动选择最适合的Cache服务器,降低不同运营商之间互联瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问速度;

加快了访问速度,减少了原站点的带宽;

用户访问时从服务器的内存中读取数据,分担了网络流量,同时减轻了原站点负载压力;

使用CDN可以分担源站的网络流量,同时减轻源站的负载压力,并降低黑客入侵及各种DDOS攻击对网站的影响,保证网站有较好的服务质量;



使用CDN的基本要求

首先要说的是,不是所有的网站都可以一上来就能用CDN的。要加速的业务数据应该存在独立的域名。如 pub.zhang21.com,业务内容图片、附件、JS、CSS等静态元素,这样的静态网站域名才能使用CDN。

将域名做CNAME(别名)

这个 pub.zhang21.com地址必须事先由CDN公司配置好的CDN公司的域名。



Nginx程序架构优化

“解耦” 是开发人员中流行的一个名词,简单地说就是把一堆程序代码按照业务用途分开,然后提供服务。

例如,注册登录、上传、下载、浏览、商品页信息等都应该是独立的程序服务,只不过在客户端看来是一个整体而已。

分离的最佳方式是分别使用独立的服务器,可以选择改动程序或者在负载均衡器上配置(如Nginx),过滤请求,然后抛给后面对应的服务器。

如,根据扩展名分发。请求图片就抛给图片服务器;

根据URL路径转发,请求下载就交给下载服务器;

请求动态PHP处理的就交给动态处理器;

不符合以上要求的就交给默认服务器;



使用普通用户启动Nginx

为什么要让Nginx服务使用普通用户?

默认情况下,Nginx的Master进程使用的是root用户,worker进程使用的是Nginx指定的普通用户。

使用root用户跑Nginx的Master进程有两个最大问题:

管理权限必须是root,这就使得最小化分配权限原则遇到困难;

使用root跑Nginx服务,一旦网站出现漏洞,用户就可以很容易地获取服务器的root权限


给Nginx服务降权的解决方案

利用普通用户user跑Nginx服务,给开发及运维设置普通账号,只要与user同组即可管理Nginx,该方案解决了Nginx管理问题,放置root分配权限过大;

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

采取项目负责制度,谁处理谁负责;


给Nginx降权

通过Nginx -c 制定配置文件启动Nginx

Nginx -c /home/user/nginx.conf

放置于user主目录,然后新建 www,logs等文件夹,更改所属组权限。

error_log /home/user/logs/error.log;

pid /home/user/logs/nginx.pid;

access_log /home/user/logs/access.log;


优点如下:

给Nginx服务降权,让网站更安全;

·按用户设置站点权限,使站点更独立(无需虚拟化隔离);

开发不需要用root即可完整管理服务及站点;

可实现责任划分;



控制Nginx并发连接数量

ngx_http_limit_conn_module这个模块用于限制每个定义的Key值的连接数,特别是单IP的连接数。

The ngx_http_limit_conn_module module is used to limit the number of connections per the defined key, in particular, the number of connections from a single IP address.

Not all connections are counted. A connection is counted only if it has a request processed by the server and the whole request header has already been read.

不是所有的连接数都会被计数,一个符合要求的连接是整个请求头已经被读取的连接。

limit_conn_zone参数

limit_conn_zone key zone=name:size;

http

limit_conn参数:指定key最大连接数

limit_conn zone number;

http,server,location

配置文件:

http {

limit_conn_zone $binary_remote_addr zone=addr:10m;

...

server {

...

location /download/ {

limit_conn addr 1;    #限制单IP的并发连接为1

}



控制客户端请求Nginx的速率

The ngx_http_limit_req_module module (0.7.21) is used to limit the request processing rate per a defined key, in particular, the processing rate of requests coming from a single IP address. The limitation is done using the “leaky bucket” method.

用于限制每个IP访问每个定义Key的请求速率。

limit_req_zone key zone=name:size rate=rate;

http

limit_req zone=name

http,server,location

举例:

http {

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

...

server {

...

location /search/ {

limit_req zone=one burst=5;

}



重点

安全优化:隐藏Nginx软件名及版本号;

性能加安全优化:连接超时参数及FastCGI相关参数调优;

性能优化:gzip压缩功能即调试查看方法;

性能优化:expires缓存功能及调试查看方法;

安全优化:集群中各角色服务站点目录权限控制策略;

安全优化:站点目录下所有的文件和目录访问控制;

性能加安全优化:robots.txt协议及防怕从优化解决方案;

性能加安全优化:静态资源防盗链解决方案;

用户体验优化:错误页面优雅显示方法;

安全优化:限制http请求方法;

性能加安全优化:CDN加速知识;

安全优化:普通用户运行Nginx方案策略;

性能加安全优化:Nginx并发连接及请求速率控制;

你可能感兴趣的:(Nginx Web服务优化)