web网站集群之企业级Nginx Web服务优化详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web网站集群之企业级Nginx Web服务优化详解相关的知识,希望对你有一定的参考价值。
1. 隐藏nginx版本信息优化(安全优化)
官方参考链接:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens
Syntax: server_tokens on | off | build | string;
Default: server_tokens on;(默认显示nginx服务版本)
Context: http, server, location
实践配置:
server {
listen 80;
server_name www.etiantian.org;
server_tokens off;
root html/www;
index index.html index.htm;
}
[[email protected] conf]# curl -I www.etiantian.org
HTTP/1.1 200 OK
Server: nginx <-- 版本号信息已经隐藏
Date: Thu, 08 Mar 2018 06:15:18 GMT
Content-Type: text/html
Content-Length: 19
Last-Modified: Mon, 05 Feb 2018 00:58:31 GMT
Connection: keep-alive
ETag: "5a77ac37-13"
Accept-Ranges: bytes
2 修改nginx服务名称信息优化(安全优化)
可以通过修改程序源代码,实现修改nginx服务名称
第一个文件: /server/tools/nginx-1.12.2/src/core/nginx.h
13行#define NGINX_VERSION "6.6.6" #<==已修改为想要显示的版本号
14行 #define NGINX_VER “oldboy/" NGINX_VERSION #<==已修改为想要显示的名字
22行 #define NGINX_VAR ”oldboy" #<==已修改为想要显示的名字
将以上源码文件中三行内容进行修改
第二个文件:/server/tools/nginx-1.12.2/src/http/ngx_http_header_filter_module.c
49行 static u_char ngx_http_server_string[] = "Server: oldboy" CRLF; #<=== 将nginx名称改为想要显示的名字
第三个文件:nginx1.xxx/src/http/ngx_http_special_response.c
改动之前配置信息
21 static u_char ngx_http_error_full_tail[] =
22 "<hr><center>" NGINX_VER "</center>" CRLF
23 "</body>" CRLF
24 "</html>" CRLF
25 ;
改动之后配置信息
21 static u_char ngx_http_error_full_tail[] =
22 "<hr><center>" NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF
23 "</body>" CRLF
24 "</html>" CRLF
25 ;
改动之前配置信息:
35 static u_char ngx_http_error_tail[] =
36 "<hr><center>nginx</center>" CRLF
37 "</body>" CRLF
38 "</html>" CRLF
39 ;
改动之后配置信息:
35 static u_char ngx_http_error_tail[] =
36 "<hr><center>oldboy</center>" CRLF
37 "</body>" CRLF
38 "</html>" CRLF
3. 修改nginx软件worker_processes进程用户信息(安全优化)
第一种方法:
编译安装软件时,指定配置参数
--user=www --group=www
第二种方法:
修改服务配置文件,实现修改worker进程用户
官方链接说明:http://nginx.org/en/docs/ngx_core_module.html#user
Syntax:user user [group];
Default:user nobody nobody;
Context:main
实践配置:
user oldboy oldboy;
worker_processes 1;
error_log /tmp/error.log error;
[[email protected] nginx-1.12.2]# ps -ef|grep nginx
root 47630 1 0 14:48 ? 00:00:00 nginx: master process nginx
oldboy 47713 47630 0 15:01 ? 00:00:00 nginx: worker process
4 修改nginx软件worker_processes进程数量(性能优化)
官方参考链接:http://nginx.org/en/docs/ngx_core_module.html#worker_processes
Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main
worker_processes进程数据建议:(一般和CPU的核数设置一致;高并发可以和CPU核数2倍)
1)建议数量和你的服务器CPU核数一致
a. grep processor /proc/cpuinfo|wc -l
b. 如何通过top命令获取cpu核数:按键盘数字1获取到
2) 建议数量和你的服务器cpu核数两倍一致
5 优化nginx服务进程均匀分配到不同CPU进行处理(性能优化)
官方参考链接:http://nginx.org/en/docs/ngx_core_module.html#worker_cpu_affinity
Syntax: worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main
4核4路CPU配置方法
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
8核4路CPU配置方法:
worker_processes 8;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
4核心2路CPU配置方法:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_processes 4;
worker_cpu_affinity 0101 1010;
6 优化nginx事件处理模型(性能优化)
官方参考链接:http://nginx.org/en/docs/ngx_core_module.html#use
Syntax: use method;
Default: —
Context: events
实践优化配置:
events {
worker_connections 1024;
use epoll;
}
7 调整Nginx单个进程允许的客户端最大连接数(性能优化)
官方参考链接:http://nginx.org/en/docs/ngx_core_module.html#worker_connections
Syntax:worker_connections number;
Default:worker_connections 512;
Context:events
注意事项:
worker_connections*worker_processes <= 系统的最大打开文件数
#加大文件描述
echo '* - nofile 65535 ' >>/etc/security/limits.conf
8 配置Nginx worker进程最大打开文件数(性能优化)
官方参考链接:http://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile
Syntax:worker_rlimit_core size;
Default:—
Context:main
实践配置:
worker_rlimit_nofile 65535;
#<==最大打开文件数,可设置为系统优化后的ulimit -HSn的结果,在第3章中,调整系统文件描述符和这个问题有相同之处
9 优化nginx服务数据高效传输模式(性能优化)
官方链接参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile
Syntax:sendfile on | off;
Default:sendfile off;
Context:http, server, location, if in location
sendfile on 开启底层高效传输数据模式
官方链接参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nopush
Syntax:tcp_nopush on | off;
Default:tcp_nopush off;
Context:http, server, location
tcp_nopush on 对快递员有利(自身服务器有利)
让数据不着急传输
网络中传输数据的车==数据包 1500 3100k 1500 1500 100 1400
官方链接参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#tcp_nodelay
Syntax:tcp_nodelay on | off;
Default:tcp_nodelay on;
Context:http, server, location
tcp_nodelay on 对用户感知更好
尽快将数据传输出去
实践配置:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
10 优化Nginx连接参数,调整连接超时时间 (安全优化)
keepalive_timeout <-- 表示传输双方在指定时间内,没有数据传输就超时断开连接
官方链接参考:https://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
Syntax: keepalive_timeout timeout [header_timeout];
Default: keepalive_timeout 75s;
Context: http, server, location
client_header_timeout <-- 表示客户端发送请求报文的请求头部信息间隔超时时间
官方链接参考:https://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout
Syntax:client_header_timeout time;
Default:
client_header_timeout 60s;
Context:http, server
client_body_timeout <-- 表示客户端发送请求报文的请求主体信息间隔超时时间
官方链接参考:https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
Syntax:client_body_timeout time;
Default:
client_body_timeout 60s;
Context:http, server, location
send_timeout <-- 表示服务端发送响应报文的间隔超时时间
官方链接参考:https://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout
Syntax:send_timeout time;
Default:
send_timeout 60s;
Context:http, server, location
11 优化nginx服务上传文件限制 (安全优化)
client_max_body_size 控制上传数据大小限制参数
官方链接参考:https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
Syntax:client_max_body_size size;
Default:client_max_body_size 1m;
Context:http, server, location
12 配置Nginx gzip压缩实现性能优化
100k ---- 1s 90k
100k ---- 5s 10k
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 7;
gzip_types text/css text/xml application/javascripts;
gzip_vary on;
Syntax: gzip_buffers number size;
Default:
gzip_buffers 32 4k|16 8k;
Context: http, server, location
Syntax: gzip_comp_level level;
Default:
gzip_comp_level 1;
Context: http, server, location
Syntax: gzip_types mime-type ...;
Default:
gzip_types text/html;
Context: http, server, location
Syntax: gzip_vary on | off;
Default:
gzip_vary off;
Context: http, server, location
Syntax: gzip_min_length length;
Default:
gzip_min_length 20;
Context: http, server, location
Syntax: gzip_http_version 1.0 | 1.1;
Default:
gzip_http_version 1.1;
Context: http, server, location
13 配置Nginx expires实现让客户端缓存数据
范例1:将网站的所有图片进行缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ oldboy.jpg
{
expires 30d;
}
范例2:将网站程序代码文件在本地进行缓存
location ~ .*\.(js|css)$
{
expires 30d;
}
注意事项:
01. 进行缓存的时间要设置合理
02. 不是所有请求的数据信息都可以进行缓存
14 Nginx日志相关优化与安全
1)要将web服务日志信息进行切割处理
2)不记录不需要的访问日志
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
3)对重要日志信息进行授权
chown -R root.root /app/logs
chmod -R 700 /app/logs
4)进行日志清理
编写脚本自动化清除日志
15 Nginx站点目录及文件URL访问控制
公司会搭建内部网站平台,只想让公司内部人员进行查看
范例1:配置Nginx,禁止解析指定目录下的指定程序。
location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$
{
allow 10.0.0.0/24;
deny 10.0.0.0/24;
}
location ~ ^/static/.*\.(php|php5|sh|pl|py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
{
deny all;
}
范例1:配置禁止访问指定的单个或多个目录。
禁止访问单个目录的命令如下:
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
16 配置Nginx,禁止非法域名解析访问企业网站
方法1:让使用IP访问网站的用户,或者恶意解析域名的用户,收到501错误,命令如下:
server {
listen 80;
server_name _;
return 501;
}
方法2:通过301跳转到主页,命令如下:
server {
listen 80;
server_name _;
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
方法3:发现某域名恶意解析到公司的服务器IP,在server标签里添加以下代码即可,若有多个server则要多处添加。
if ($host !~ ^www\.oldboyedu\.com$)
{
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
17 Nginx图片及目录防盗链解决方案
模拟实现盗链过程:
01. 配置盗链网站信息
第一个里程:编写盗链网站配置文件
server {
listen 80;
server_name www.daolian.org;
root html/daolian;
index index.html index.htm;
}
第二里程:编写盗链网站程序代码
<html>
<head>
<title>老男孩教育
</title>
</head>
<body bgcolor=green>
whw的博客!
<br>我的博客是linux
<a href="http://oldboy.blog.51cto.com" target="_blank">博客地址
</a>
<img src="http://www.etiantian.org/ mp4/ sdfasdfdsaadsf/10-10/test.mp4">
</body>
</html>
02. 配置被盗链网站信息
在站点目录下,生成要被盗链的图片信息
[[email protected] www]# ll oldboy.jpg
-rw-r--r-- 1 root root 71806 3月 9 16:27 oldboy.jpg
1) 根据HTTP referer实现防盗链
location ~ .*\.(jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { <--- 判断只要用户访问的是图片资源
valid_referers none blocked *.etiantian.org etiantian.org;
if ($invalid_referer){
rewrite ^/ http://www.etiantian.org/nolink.png;
}
}
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { <==说明:将盗链提示图片缓存到用户本地
valid_referers none blocked server_names *.etiantian.org etiantian.org;
if ($invalid_referer){
rewrite ^/ http://bbs.etiantian.com/img/nolink.jpg;
}
access_log off;
root html/www;
expires 1d;
break;
}
}
2) 根据cookie防盗链
3) 通过加密变换访问路径实现防盗链(扩展研究)
研究nginx模块 ngx_http_accesskey_module
4)在产品设计上解决盗链方案
在数据信息上加上水印logo信息
18 Nginx错误页面的优雅显示
##www
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
error_page 403 /403.html; #<==当出现403错误时,会跳转到403.html页面
}
范例2:50x页面放到本地单独目录下,进行优雅显示。
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data0/www/html;
}
范例3:改变状态码为新的状态码,并显示指定的文件内容,命令如下:
error_page 404 =200 /empty.gif;
server {
listen 80;
server_name www.linuxpeixun.com;
location / {
root /data0/www/bbs;
index index.html index.htm;
fastcgi_intercept_errors on;
error_page 404 =200 /ta.jpg;
access_log /app/logs/bbs_access.log commonlog;
}
}
范例4:错误状态码URL重定向,命令如下:
server {
listen 80;
server_name www.oldboyedu.com;
location / {
root html/www;
index index.html index.htm;
error_page 404 http://oldboy.blog.51cto.com;
#<==当出现404错误时,会跳转到指定的URL http://oldboy.blog.51cto.com页面显示给用户,
这个URL一般是企业另外的可用地址
access_log /app/logs/bbs_access.log commonlog;
}
}
19 Nginx站点目录文件及目录权限优化
1. robots.txt机器人协议介绍(君子协议)
2. 利用user_agent参数信息进行防爬虫
范例1:阻止下载协议代理,命令如下:
## Block download agents ##
if ($http_user_agent ~* LWP::Simple|BBBike|wget)
{
return 403;
}
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")
{
return 403;
}
20 利用Nginx限制HTTP的请求方法
#Only allow these request methods
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501;
}
#Do not accept DELETE,SEARCH and other methods
if ($request_method ~* ^(GET)$ ){
return 501;
}
21 使用普通用户启动Nginx(监牢模式)
第一个里程:把nginx服务重要文件或目录信息放置到普通用户家目录中
[[email protected] ~]$ mkdir {conf,html,logs}
[[email protected] ~]$ cp /application/nginx/conf/nginx.conf.default ./conf/
[[email protected] ~]$ cp /application/nginx/conf/mime.types ./conf/
第二个里程:编写nginx配置文件
[[email protected] ~]$ cat ./conf/nginx.conf
worker_processes 1;
error_log /home/oldboy/logs/error.log;
pid /home/oldboy/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
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 /home/oldboy/logs/web_blog_access.log main;
server {
listen 80; <-- 对于普通用户是没有资格应用特殊端口 大于1024的端口可以让普通用户管理
server_name www.etiantian.org;
location / {
root /home/oldboy/html/;
index index.html index.htm;
}
}
}
第三个里程:利用普通用启动nginx程序
[[email protected] ~]$ /application/nginx/sbin/nginx -c /home/oldboy/conf/nginx.conf
nginx: [alert] could not open error log file: open() "/application/nginx-1.12.2/logs/error.log" failed (13: Permission denied)
[[email protected] ~]$ ps -ef|grep nginx
oldboy 24337 1 0 19:00 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx -c /home/oldboy/conf/nginx.conf
oldboy 24338 24337 0 19:00 ? 00:00:00 nginx: worker process
oldboy 24340 24297 0 19:00 pts/0 00:00:00 grep --color=auto nginx
以上是关于web网站集群之企业级Nginx Web服务优化详解的主要内容,如果未能解决你的问题,请参考以下文章