Nginx基本安全优化
隐藏版本号
修改配置文件nginx.conf
在http字段或者其他字段中添加
server_tokens off;
客户端进行访问展示如下:
更改源代码,隐藏Nginx软件名和版本号
1.找到源代码存放位置,修改配置文件
[root@localhost nginx-1.6.3]# vim src/core/nginx.h
#define nginx_version 1006003
#define NGINX_VERSION "1.6.3"
#define NGINX_VER "OWS/" NGINX_VERSION
#define NGINX_VAR "OWS"
#define NGX_OLDPID_EXT ".oldbin"
2.修改配置文件
[root@localhost nginx-1.6.3]# vim src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: OWS" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
3.修改配置文件
[root@localhost nginx-1.6.3]# vim src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<hr><center>" NGINX_VER "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
static u_char ngx_http_error_tail[] =
"<hr><center>OWS</center>" CRLF
4.进行重新编译nginx,使其生效。
更改nginx服务默认用户
1.[root@localhost ~]# grep '#user' /applocation/nginx/conf/nginx.conf
#user nobody;
2.为nginx创建新的用户
#useradd nginx -s /sbin/nologin -M 创建nginx用户,不让他登陆
#id nginx 检查nginx用户
3.修改配置文件,使服务使用刚刚建立的nginx用户
user nginx nginx;
4.重启nginx服务,检查用户
# nginx -s reload
[root@localhost ~]# ps -ef |grep nginx |grep -v grep
root 1491 1 0 18:27 ? 00:00:00 nginx: master process nginx
nginx 1532 1491 0 18:56 ? 00:00:00 nginx: worker process
优化nginx服务器的worker进程个数
1.修改nginx的主配置文件 nginx.conf
worker_processes 1;
此配置根据cpu核数进行设置
查看当前配置cpu
grep processor /proc/cpuinfo |wc -l 个数
grep 'physical id' /proc/cpuinfo |sort |uniq |wc -l 核数
也可以通过top命令进行查看
#top 按1
核数为1,那么 worker_processes 就设置为1即可
修改完成进行重启nginx
#nginx -t
#nginx -s reload
2.通过查看进程,查看nginx进程数量
#ps -ef |grep nginx |grep -v grep
绑定不同的nginx进程到不同的cpu上,因为多个nginx进程可能跑在某一个cpu上,可以多个cpu的负载均衡。
下面对四核cpu进程进行优化,演示如下
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity : 此字段代表ngin进程和cpu亲和力,把不同的进程分配给不同的cpu进行处理
0001 1000 都是代表 掩码 ,参数位置为main区块
修改完成后优雅重启nginx 在进行压力测试
ab -n 1000 -c 100 http://192.168.1.251/phpinfo.php
使用top命令进行查看cpu负载情况,cpu占用基本为平均
nginx事件处理模型优化
nginx的连接处理机制在不同的操作系统采用不同的I/0模型,本机使centos系统,默认为epoll多路复用模型,如果想了解更过不同操作系统所对应的模型,请自行百度去。还有 记住,apache采用的select模型
具体配置看下面,傻不愣登的
1.修改nginx主配置文件nginx.conf。在events区块中添加字段,events区块是干嘛的?忘了吧,他是设定nginx的工作模式以及连接数上限的。别鸡儿瞎添加
events {
worker_connections 1024;
use epoll ; ?? use 事件模块指令
}
其实吧,在nginx的官方文档中提示:并不需要指定事件处理模块,nginx会自动选择最佳的事件处理模块 。。。。。哈哈哈
小插曲:什么是I/O
输入/输出 (input/output) 的缩写。键盘是一种输入设备,而打印机是一种输出设备。一般来说,i/o 活动和运算活动是可以区分的。例如,程序将文档传送至打印机时,就是在进行输出活动;而程序为术语列表排序时,就是在进行运算活动。比如内存,磁盘读取,cpu I/O啊什么的。
调整nginx单个进程允许的客户端最大连接数
1.这个就是上面的events模块中的worker_connections 模块
同样,修改nginx主配置文件nginx.conf
events {
worker_connections 1024;
use epoll ;
}
一般修改为65535即可,就是鸡儿最大的 !
还要设置本地linux支持最大打开文件数量,不鸡儿改不行
敲命令: ulimit -Hsn 65535 临时设置,文件描述符
也可以在nginx配置文件中添加
worker_rlimit_nofile 65535 ; 别设置在events区块中。好像不行,试了
此参数的作用是改变work_processes能打开的最大文件数量。
优化服务器域名散列表大小
说明:先要将确切的名字和通配符名字存储在散列表中,散列表和端口关联,每个端口最多进行关联三张表:确切名字的散列表,以星号其实的通配符名字的散列表和以星号结束的通配符名字的散列表, nginx首先会搜索确切名字的散列表,如果没有找到,则搜索以星号起始的通配符名字的散列表,如果还是没有找到,继续搜索以星号的通配符名字的散列表。
举个栗子:
如果使用nginx.org 和www.nginx.org 来访问服务器为最频繁的,那么我们来定义
server字段
server {
listen 80;
server_name nginx.org www.nginx.org *.nginx.org ;
}
如果定义了大量的名字,或者tm非常长的名字,那么就需要在http字段中调用server_names_hash_max_size 和 server_names_hash_bucket_size 的值,
http {
server_names_hash_max_size 512 ; 默认设置512 吧,要不又鸡儿报错
server_names_hash_bucket_size 128; 给大点
}
开启高效文件传输模式
sendfile 参数用于开启文件的高效传输模式,可防止网络及磁盘I/O阻塞,提升nginx工作效率
1.修改主配置文件nginx.conf
放置字段 http server location
sendfile on ;
2.设置参数 tcp_nopush on ; 减少网络报文段的数量
和sendfile 相同的字段
设置完检查配置文件,nginx -t 检查语法。更改完配置文件不要记得重启nginx ,先要检查一下语法,这是常识。
今天就先到这,明天在写,别几把光写,得背下来。