1、Nginx基本安全优化

a、更改配置文件参数隐藏版本

编辑nginx.conf配置文件增加参数,实现隐藏Nginx版本号的方式如下。在nginx配置文件nginx.conf中的http标签段内加入 “server_tokens off;”参数,如下:

http{
……
server_tokens off;
……
}

此参数放置在http标签内,作用是控制http response header内的web服务版本信息的显示,以及错误信息中web服务版本信息的显示。

server_tokens参数的官方说明如下:

syntax:      server_tokens on | off ;     #此行为参数语法,on为开启状态,off为关闭状态
default: server_tokens on; #此行意思是不配置该参数,软件默认情况的结果
context: http,server, location #此行为server_tokens参数可以放置的位置 参数作用:激活或禁止nginx的版本信息显示在报错信息和servser的响应首部位置中
Enables or disables emitting of nginx version in error messages and in the "server" response header field

官方资料地址:http://nginx.org/en/docs/http/ngx_http_core_moudule.html

b、更改源码隐藏nginx软件名及版本号

第一里程碑:依次修改3个nginx源码文件

修改第一个文件为nginx-1.10.2/src/core/nginx.h,如下:

[root@web nginx-1.10.2]# sed -n '13,27p'  src/core/nginx.h
#define NGINX_VERSION "1.10.2"    #修改为想要显示的版本号,如1.6.2
#define NGINX_VER "nginx/" NGINX_VERSION    #将nginx修改为想要修改的软件名称,如Apache


#ifdef NGX_BUILD
#define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")"
#else
#define NGINX_VER_BUILD NGINX_VER
#endif


#define NGINX_VAR "NGINX"       #将nginx修改为想要修改的软件名称,如Apache           
#define NGX_OLDPID_EXT ".oldbin"

#endif /* _NGINX_H_INCLUDED_ */


修改第二个文件是nginx-1.10.2/src/http/ngx_http_header_filter_module.c 的49行,需要修改的字符串如下:

[root@web nginx-1.10.]# grep -n 'Server: nginx' src/http/ngx_http_header_filter_module.c
:static char ngx_http_server_string[] = "Server: nginx" CRLF; #把“Server: nginx”替换为“Server: Apache” 提示:sed替换命令
sed  "49 s#Server: nginx#Server: Apache#" src/http/ngx_http_header_filter_module.c
sed -i "49 s#nginx#Apache#" src/http/ngx_http_header_filter_module.c

修改第三个文件是 nginx-1.10.2/src/http/ngx_http_special_response.c,对外页面报错时,它会控制是否展示敏感信息。

[root@web nginx-1.10.]# sed -n '21,30p' src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<hr><center>" NGINX_VER "</center>" CRLF #此行需要修改,修改为"<hr><center>" NGINX_VER "(http://www.xxx.com)</center>" CRLF
"</body>" CRLF "</html>" CRLF ; 
static u_char ngx_http_error_tail[] = "<hr><center>nginx</center>" CRLF #此行需要修改,将对外展示的nginx改为Apache
"</body>" CRLF

注:修改后编译安装软件,启动服务使其生效。

C、更改nginx服务的默认用户

为了让web服务更安全,要尽可能地改掉软件默认的所有配置,包括端口、用户等,通用其他软件服务。

nginx服务启动后,默认用户是nobody(编译安装时可以指定创建用户),查看默认配置文件,如下:

[root@web nginx-1.10.]# grep "#user" conf/nginx.conf.default
#user nobody;

为了防止黑客使用默认用户进行攻击,用户需要更改成特殊的用户,例如www或nginx等等,但用户必须存在,下面以www用户为例进行说明。

第一里程碑:创建用户

useradd  -s /sbin/nologin -m  www        #无需有登录权限,只需在系统内容执行任务

id www      #检查创建的用户

第二里程碑:配置nginx服务,让其使用创建的用户www用户(编译安装时已指定用户,无需做此操作)

将默认的#user nobody;改为以下内容:
user www www
注:如果注释或不设置上述参数,默认用户为nobody用户,不推荐使用nobody用户名。
编译安装nginx软件时指定编译的用户和组,编译命令如:
./configure --prefix=/usr/local/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module  --with-http_ssl_module

第三里程碑:检查更改用户的效果

重新加载配置后,检查nginx服务进行的对应用户,如下:

[root@web nginx-1.10.2]# ps -ef | grep nginx | grep -v grep

2、根据nginx.conf配置文件参数优化nginx服务性能

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

a、优化nginx服务的worker进程个数

01、优化nginx进程对应nginx服务的配置参数如下:

#配置文件信息
[root@web nginx-1.10.]# cat conf/nginx.conf
worker_processes ;
events {
worker_connections ;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout ;
……
} #需要修改的参数:
worker_processes ; #指定了nginx要开启的进程数,结尾的数字就是进程的个数 注:worker_processes参数调整的是nginx服务的worker进程数,nginx有master进程和worker进程之分,Master为管理员进程,真正接待“顾客”的是worker进程。

02、优化nginx进程个数的策略

work_processes参数大小的设置最好和网站的用户数量相关联。

搭建服务器时,worker进程数最开始的设置可以等于CPU的核数,且worker进程数要多一些,这样起始提供服务时就不会出现因为访问量快速增加而临时启动新进程提供服务的问题,缩短了系统的瞬时开销和提供服务的时间,提升了服务用户的速度。高流量高并发场合也可以考虑将进程数提高至CPU核数*2,具体情况要根据实际的业务来选择,因为这个参数除了要和CPU核数匹配外,也和硬盘存储的数据及系统的负载有关,设置为CPU的核数是一个好的起始配置。

03、查看web服务器CPU硬件资源信息

下面介绍查看linux服务器CPU总核数的方法。

通过/proc/cpuinfo可查看CPU个数及总核数。查看CPU总核数的示例如下:

[root@web ~]# grep processor /proc/cpuinfo |wc -l
8 #表示为1颗CPU八核
[root@web ~]# grep processor /proc/cpuinfo

查看CPU总颗数的示例如下:

[root@web ~]# grep 'physical id' /proc/cpuinfo |sort|uniq |wc -l
1 #对physical id去重计数,表示1颗CPU

通过执行top命令,然后按数字1,即可显示所有CPU核数,如下:

[root@web ~]# top  #按1显示多核CPU
top - :: up :, user, load average: 0.00, 0.00, 0.00
Tasks: total, running, sleeping, stopped, zombie
Cpu0 : 0.3%us, 1.0%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.1%us, 1.0%sy, 0.0%ni, 98.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.3%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.2%us, 1.0%sy, 0.0%ni, 98.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 0.1%us, 1.0%sy, 0.0%ni, 98.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 0.1%us, 1.0%sy, 0.0%ni, 98.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 0.3%us, 1.0%sy, 0.0%ni, 98.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 0.2%us, 1.0%sy, 0.0%ni, 98.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%
st
Mem: 2493928k total, 485836k used, 2008092k free, 79828k buffers
Swap: 1048572k total, 0k used, 1048572k free, 187784k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root S 0.3 0.0 :26.20 events/
root S 0.0 0.3 :02.06 init
注:这是单CPU 八核的信息
例如:CPU核数为8,就配置worker_processes 8

04、实操==》修改nginx配置

第一里程碑:检查nginx.conf配置文件里的worker_processes数来了解,命令如下:

[root@web conf]# grep worker_processes nginx.conf
worker_processes ;

第二里程碑:修改配置文件中参数

[root@web conf]# sed -i 's#worker_processes  1#worker_processes  8#g' nginx.conf
[root@web conf]# grep worker_processes nginx.conf
worker_processes ;

第三里程碑:平滑启动nginx,使修改生效,如下:

[root@web conf]# /usr/local/nginx/sbin/nginx -t         #检查配置文件是否有错,养成修改配置文件后检查的好习惯(修改配置文件需要先备份)
nginx: the configuration file /usr/local/nginx-1.10.2//conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.10.2//conf/nginx.conf test is successful [root@web02 conf]# /application/nginx/sbin/nginx -s reload #平滑重启

第四里程碑:检查修改后worker进程数量,命令如下:

[root@web conf]# ps -ef | grep nginx | grep -v grep

参考链接:http://nginx.org/en/docs/ngx_core_module.html

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

优化不同的nginx进程对应不同的CPU配置时,八核CPU服务器的参数配置参考如下:

[root@web02 conf]# cat nginx.conf
worker_processes ;
worker_cpu_affinity #此行为cpu亲和力参数,cpumask为cpu掩码
events {
worker_connections ;
}
……

worker_cpu_affinity的作用是绑定不同的worker进程数到一组CPU上。通过设置bitmask控制进行允许使用的CPU,默认worker进程不会绑定到任何CPU。

示例配置:

worker_processes  ;
worker_cpu_affinity
#绑定每个工作进程到一个单独的CPU,而
worker_processes ;
worker_cpu_affinity ;
#绑定第一个工作进程到CPU0/CPU2,第二个工作进程绑定到CPU1/CPU3。第二个例子适用于超线程。 #特殊值auto允许将工作进程自动绑定到可用的CPU:
# worker_processes auto;
# worker_cpu_affinity auto; 参考链接:http://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity

C、nginx事件处理模型优化

nginx的联机处理机制在不同的操作系统会采用不同的I/O模型,在linux下,nginx使用epoll的I/O多路复用模型,在freebsd中使用kequeue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在windows中使用的是icop等等。

要根据系统类型选择不同的时间处理模型,可供使用的选择有“use[kqueue|rtsig|epoll|/dev/poll|select|poll];”,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在linux平台上,而kqueue用在BSD系统中。对于linux系统linux 2.6.x的内核,推荐选择epoll工作模式,这是高性能高并发的设置。

本环境使用centos 6.9,因此将nginx的事件模型调整为epoll模型。

具体配置参数如下:

events            #events指令是设定nginx的工作模式及连接数上限
{
use epoll;
#use是一个事件模块指令,用来指定nginx的工作模式。
}

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

控制连接数的参数为worker_connections,此值要根据具体服务器性能和程序的内存使用量来指定,配置如下:

events  #events指令是设定nginx的工作模式及连接数上限
{
worker_connections ;
#最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令 “ulimit -Hsh 65535”或配置相应文件后,worker_connections的设置才能生效
} 参考链接:http://nginx.org/en/docs/ngx_core_module.html

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

参数配置如下:

worker_rlimit_nofile  ;
#最大打开文件数限制,执行操作系统命令 “ulimit -HSh ”的结果

f、优化服务器域名的散列表大小

在HTTP配置块中调整server_names_hash_max_size和server_names_hash_bucket_size的值。
server_names_hash_bucket_size的默认值可能是32或64,也可能是其他值,这取决于CPU的缓存行的长度。

g、开启高效文件传输模式

、设置参数:sendfile  on;
、设置参数:tcp_nopush on; 参考链接:http://nginx.org/en/docs/http/ngx_core_module.html#sendfile
http://nginx.org/en/docs/http/ngx_core_module.html

h、优化nginx连接参数,调整连接超时时间

nginx连接超时的参数设置:
、设置参数:keepalive_timeout ;
、设置参数tcp_nodelay on;
、设置参数:client_header_timeout ;
#用于设置读取客户端请求头数据的超时时间。此处的数值为15,其单位是秒,为经验参考值。
、设置参数:client_body_timeout
#用于设置读取客户端请求主题的超时时间,默认值时60.
、设置参数:send_timeout ;
#用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接。

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

在主配置文件里加入如下参数:

client_max_body_size 8m;     #具体大小根据业务做调整

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

FastCGI Cache资料链接:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

worker_processes  ;
pid conf/nginx.pid;
events {
worker_connections ;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout ;
client_header_timeout ;
client_body_timeout ;
send_timeout ;
gzip on;
server_tokens off;
fastcgi_connect_timeout ;
fastcgi_send_timeout ;
fastcgi_read_timeout ;
fastcgi_buffer_size 64k;
fastcgi_buffer 64k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=:

keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; server {
listen ;
server_name localhost;
access_log logs/host.access.log main;
location / {
root html;
index index.php index.html index.htm;
}
} location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
include fastcgi_conf;
fastcgi_cache ngx_fcgi_cache;
fastcgi_cache_valid
1h;
fastcgi_cache_valid 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses ;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key http://$host$request_uri;

} ……

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

目的:节省带宽、提高访问速度。

参数介绍及配置:

gzip on   #开启压缩功能
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1k.
gzip_buggers 16k; #压缩缓冲区大小。表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; #压缩版本(默认1.1,前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,使用默认即可。
gzip_comp_level ; #压缩比率。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,单处理最慢,也比较消耗CPU资源。
gzip_types text/plain application/x-javascript text/css application/xml; #用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分将的媒体类型。
gzip_vary on; #vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面。例如用squid缓存经过nginx压缩的数据。 #完整配置如下:
gzip on;
gzip_min_length 1k;
gzip_buffers 32k;
gzip_http_version 1.1;
gzip_comp_level ;
gzip_types text/css text/xml /app/javascripts;
gzip-vary on; 注:不同版本的nginx,gzip_types的配置可能会有不同。

L、配置nginx expires 缓存实现性能优化

目的:降低网站的带宽、节约成本、加快访问速度、减轻服务器压力。

a、根据扩展名进行判断

nginx expires配置详解(配置在nginx.conf中的server模块中):
……
server{
…… location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 365d; 当用户访问网站URL结尾的文件扩展名为上述指定类型的图片时,设置缓存365天。
} location ~ .*\.(js | css)?$
{
expires 30d; #当用户访问网站URL结尾的文件扩展名为js、css类型的元素时,设置缓存30天。
}
……

b、根据URI中的路径(目录)进行判断,添加expires功能范例

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

c、单个文件添加expires功能范例

location ~(robots.txt){
expires 7d; #给robots.txt机器人文件设置过去时间,在设置的期间内不记录404错误日志。
break; }

Nginx expires功能缺点及解决方法

当网站被缓存的界面或数据更新了,此时用户端看到还是旧的已经缓存的内容,这样就会影响到用户体验,解决方法如下:

  • 对于经常需要变动的图片等文件,可以缩短对象缓存时间。例:谷歌的首页图片经常根据不同的日期换成一些节日图,所以可以将这个图片设置为缓存期1天。
  • 当网站改版或更新时,可以在服务器将缓存的对象改名(网站代码程序)
  1. 对于网站的图片、附件,一般不会被用户直接修改,用户层面上的修改图片,实际上个是重新传到服务器,虽然内容一样,但是会产生一个新的图片名称。
  2. 网站改版升级会修改js、css等样式文件,若改版时对这些样式文件中的元素改了名,会使得前端的CDN及用户端需要重新缓存内容。

企业网站缓存日期曾经的案例参考:

若企业的业务和网站访问量不同,那么网站的缓存时间设置也是不同,如下企业所用的缓存日期:

  • 51CTO:1周
  • 新浪:15天
  • 京东:25年
  • 淘宝:10年

Nginx web服务优化 (一)的更多相关文章

  1. Linux实战教学笔记38:企业级Nginx Web服务优化实战(下)

    四,Nginx站点目录及文件URL访问控制 4.1 根据扩展名限制程序和文件访问 Web2.0时代,绝大多数网站都是以用户为中心多的,例如:bbs,blog,sns产品,这几个产品都有一个共同特点,就 ...

  2. Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

    一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的.因此,我们应尽量隐 ...

  3. nginx web服务优化

    nginx基本安全优化 1. 调整参数隐藏nginx软件版本号信息 软件的漏洞和版本有关,我们应尽量隐藏或消除web服务对访问用户显示各类敏感信息(例如web软件名称及版本号等信息),这样恶意的用户就 ...

  4. 企业级Nginx Web服务优化实战

    web优化一览总结表 优化类型 优化说明 优化方法 安全优化 隐藏nginx版本信息优化 修改nginx配置文件实现优化 server_tokens off: 修改nginx版本信息优化 修改ngin ...

  5. 2-4、nginx特性及基础概念-nginx web服务配置详解

    Nginx Nginx:engine X 调用了libevent:高性能的网络库 epoll():基于事件驱动event的网络库文件 Nginx的特性: 模块化设计.较好扩展性(不支持模块动态装卸载, ...

  6. Nginx Web服务(一)

    一.Nginx原理介绍 1.1:什么是Nginx Nginx是一个开源的,支持高性能.高并发的WWW服务和代理服务软件 1.2:Nginx的功能特点及应用场合 ① 支持高并发:能支持几万并发连接,特别 ...

  7. 02·nginx进阶·服务优化配置管理

    企业场景常用的Nginx http功能模块汇总 ngx_ http_ core_ module 包括-些核心的http 参数配置,对应Nginx的配置为HTTP区块部分 ngx_ http _acce ...

  8. Nginx Web服务应用

    Nginx 指令目录 Nginx 介绍 Nginx 编译安装 Nginx 功能模块 Nginx 目录结构 Nginx 配置文件 Nginx 虚拟主机配置 Nginx 状态信息功能配置 Nginx 错误 ...

  9. centos7 搭建 nginx web服务 反代理

    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...

随机推荐

  1. Java生成唯一ID

    这里我用的是Java提供的java.util.UUID类来产生随机字串,UUID码是什么我就不再赘述,能满足我们的需求就可以. 下面是java代码: import java.util.UUID; pu ...

  2. 浅谈ajax同步、异步的问题

    最近实习的时候看到过firefox的同步.异步的警告,想着概念不是那么清楚,于是整理了一下ajax同步异步方面的知识.我是小白,做个笔记. 首先就是概念问题,ajax根据async进行区分同步和异步过 ...

  3. Markdown 版本演进

    本文作为 Markdown 系列的第二篇,对上一篇使用 Markdown 写技术博客,我踩过的 6个坑博客提到的版本变迁进行简要的提纲说明. 如果不想读文章,请直接看思维导图,使用 Atom + ma ...

  4. Gitlab CI-3.遇到的问题

    五.遇到的问题 1. cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs 报错信息:ERROR ...

  5. Python处理PDF和Word文档常用的方法(二)

    Python处理word时,需要安装和导入python-docx模块. 安装命令:pip install python-docx 导入命令:import docx 编码编写顺序:用docx.Docum ...

  6. Python-opencv摄像头图像捕获

    实例一 (灰色调度) #!/usr/bin/env python # _*_ coding:utf-8 _*_ import cv2 as cv import numpy as np capture ...

  7. [!] Attempt to read non existent folder `***********`

    以前遇到过的问题,最近又出现了,问题单独列出,容易查找: $ pod install [!] Attempt to read non existent folder `/Users/galahad/D ...

  8. PHP 抽象类和接口区别

    php中抽象类和接口的区别 1) 概念 面向对象的三大概念:封装,继承,多态 把属性和方法封装起来就是类.      一个类的属性和方法被另外的类复制就是继承,PHP里面的任何类都可以被继承,被继承的 ...

  9. b6

    吴晓晖(组长) 过去两天完成了哪些任务 对手写输入进行了重构,然后重新捋了一下bayes的思路 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完 ...

  10. Leetcode题库——28.实现strStr()

    @author: ZZQ @software: PyCharm @file: strStr.py @time: 2018/11/6 20:04 要求:给定一个 haystack 字符串和一个 need ...