Nginx web 服务优化
- 1、Nginx 版本号隐藏
- 2、更改nginx服务的默认用户(源码安装)
- 二、nginx参数优化服务性能
- 三、日志优化
- 1、实现 Nginx access 日志轮询
- 2、不记录不需要的访问曰志
- 3、设置访问日志的权限
- 1、根据扩展名限制程序和文件的访问
- 2、禁止访问指定目录下的所有文件和目录
- 3、配置 Nginx, 禁止非法域名解析访问企业网站
- 1、针对文件名防盗链
- 2、针对图片目录防盗
- 3、nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链
本环境是基于 Centos 7.8 系统构建Nginx学习环境
具体构建,请参考 Nginx-1.18.0 环境部署
一、Nginx 基本安全优化
1、Nginx 版本号隐藏
yum 方式安装
http {
...
server_tokens off;
...
}
[root@node01 ~]# nginx -s reload
优化前

优化后

源码方式
[root@node02 ~]# vim /usr/local/src/nginx-1.18.0/src/core/nginx.h
#define nginx_version 0000000
#define NGINX_VERSION "0.0.0"
#define NGINX_VER "web_servers" NGINX_VERSION
#define NGINX_VAR "web_servers"
#define NGX_OLDPID_EXT ".oldbin"
[root@node02 ~]# vim /usr/local/src/nginx-1.18.0/src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: web_servers" CRLF;
[root@node02 ~]# vim /usr/local/src/nginx-1.18.0/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>web_servers</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
[root@node02 ~]# cd /usr/local/src/nginx-1.18.0/
[root@node02 nginx-1.18.0]# make
[root@node02 nginx-1.18.0]# make install
[root@node02 nginx-1.18.0]# systemctl restart nginx
优化前

优化后

2、更改nginx服务的默认用户(源码安装)
方法一
user nginx;
[root@node01 ~]# systemctl restart nginx
方法二
[root@node02 nginx-1.18.0]# ./configure --user=wan --group=wan --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_stub_status_module --with-http_mp4_module
[root@node02 nginx-1.18.0]# make
[root@node02 nginx-1.18.0]# make install
二、nginx参数优化服务性能
# nginx开始的进程数
worker_processes 2;
# 优化绑定不同的nginx到不同的cup上
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 设定nginx工作模式、nginx客户端最大连接数
events {
use epoll;
worker_connections 1024;
}
# 配置 Nginx worker 进程最大打开文件数
worker_rlimit_nofile 65535
# 开启nginx高效文件传输模式
sendfile on;
tcp_nopush on;
# 上传文件大小限制
client_max_body_size 25m;
# 设定nginx功能
--开启 gzip 压缩功能
gzip on;
--设置允许压缩的页面最小字节数
gzip_min_length 1k;
--压缩缓冲区大小
gzip_buffers 4 16k;
--压缩版本
gzip_http_version 1.1;
--压缩比率
gzip_comp_level 2;
--压缩的类型
gzip_types text/plain application/x-javascript text/css application/xml;
-- vary header 支持
gzip_vary on;
[root@node01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@node01 ~]# nginx -s reload
三、日志优化
1、实现 Nginx access 日志轮询
当用户请求一个软件时, 绝大多数软件都会记录用户的访问情况, Nginx 服务也不例外。我们可以通过脚本+计划任务或者logrotate服务做Nginx access的轮转切割
具体细节参照:计划任务 Nginx 日志轮询切割
2、不记录不需要的访问曰志
在实际工作中, 对于负载均衡器健康节点检查或某些特定文件( 比如图片 、 JS、css) 的日志, 一般不需要记录下来, 因为在统计 PV 时是按照页面计算的, 而且日志写入太频繁会消耗大量磁盘 1/0, 降低服务的性能。
[root@node01 ~]# vim /etc/nginx/conf.d/default.conf
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
access_log off;
}
[root@node01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@node01 ~]# nginx -s reload
3、设置访问日志的权限
不需要在日志目录上给 Nginx 用户读或写许可,如果把该权限直接给了 Nginx 或 Apache 用户, 这就成为安全隐患。
[root@node02 ~]# ll /usr/local/nginx/logs/ -d
drwxr-xr-x 2 root root 58 Feb 27 09:57 /usr/local/nginx/logs/
[root@node02 ~]# chmod -R 700 /usr/local/nginx/logs/
[root@node02 ~]# ll /usr/local/nginx/logs/ -d
drwx------ 2 root root 58 Feb 27 09:57 /usr/local/nginx/logs/
四、站点目录、URL访问优化
1、根据扩展名限制程序和文件的访问
Web 2.0 时代, 绝大多数网站都是以用户为中心的, 例如: bbs 、 blog、 sns 产品,这几个产品都有一个共同特点, 就是不但允许用户发布内容到服务器, 还允许用户发图片甚至上传附件到服务器上,由于为用户开了上传的功能, 因此给服务器带来了很大的安全风险。 虽然很多程序在上传前会做一定的控制, 例如: 文件大小、 类型等, 但是,一不小心就会被黑客钻了空子, 上传了木马程序。下面将利用 Nginx 配置禁止访问上传资源目录下的 PHP、 Shell、PerK Python 程序文件, 这样用户即使上传了木马文件也没法执行, 从而加强了网站的安全。
配 置 Nginx, 禁止解析指定目录下的指定程序
location ~ ^/images/.*\.(php|php5|sh|pl|py)$
{
deny all ;
}
location ~ ^/static/.*\.(php|php5|sh|pl|py)$
{
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$
{
deny all;
}
对上述目录的限制必须写在 Nginx 处理 PHP 服务配置的前面
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
Nginx 下配置禁止访问 *.txt 和 *.doc 文件
location ~*\.(txt|doc)$ {
if (-f $reguest_filename) {
root /data/www/www;
#rewrite 可以重定向到某个url
break;
)
}
} l
ocation ~*\.(txt|doc)${
root /data/www/www;
deny all;
}
2、禁止访问指定目录下的所有文件和目录
配置禁止访问指定的单个或多个目录
l
ocation ~ ^/(static)/ {
deny all;
} l
ocation ~ ^/static {
deny all;
}
禁止访问多个目录的命令
l
ocation ~ ^/(static|js)/ {
deny all;
}
禁止访问目录并返回指定的 HTTP 状态码
s
erver {
listen
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; }
}
作用:禁止访问目录下的指定文件, 或者禁止访问指定目录下的所有内容。
最佳应用场景: 对于集群的共享存储, 一般是存放静态资源文件, 所以可禁止执行指定扩展名的程序, 例: .php 、 .sh、 .pl、.py。
3、配置 Nginx, 禁止非法域名解析访问企业网站
Nginx 如何防止用户 IP 访问网站
方法1:让 使 用 IP 访问网站的用户, 或者恶意解析域名的用户, 收到 501 错误
server {
listen 80 defau11_server;
server_name _;
return 501;
}
方法2:通过 301 跳转到主页
s
erver {
listen 80 default_server;
server_name _;
rewrite ^(.*) http://blog.test.org/$1 permanent;
}
方法 3 : 发现某域名恶意解析到公司的服务器 IP,在可若有多个server 标签里添加以下代码即server 则要多处添加
if ($host !~ ^www/.test/.com$){
rewrite ^(.*) http//www.test.com$l permanent;
五、Nginx 图片及目录防盗链
什么是资源盗链 ?
简单地说, 就是某些不法网站未经许可, 通过在其自身网站程序里非法调用其他网站的资源, 然后在自己的网站上显示这些调用的资源, 达到填充自身网站的效果。 这一举动不仅浪费了调用资源网站的网络流量, 还造成其他网站的带宽及服务压力吃紧, 甚至宕机。
网站资源被盗链带来哪些问题 ?
若网站图片及相关资源被盗链, 最直接的影响就是网络带宽占用加大了, 带宽费用多了, 网络流量也可能忽高忽低, Nagios/Zabbix 等报警服务频繁报警。
常见防盗链解决方案的基本原理
1 ) 根据 HTTP referer 实现防盗链
在 HTTP 协议中, 有一个表头字段叫 referer, 使用 URL 格式来表示是哪里的链接用了当前网页的资源。 通过 referer 可以检测访问的来源网页, 如果是资源文件, 可以跟踪到显示它的网页地址, 一旦检测出来源不是本站, 马上进行阻止或返回指定的页面。referer 是目前网站图片 、 附件 、 html 等最常用的防盗链手段。
2 ) 根据 cookie 防盗链
对于一些特殊的业务数据, 例如流媒体应用通过 ActiveX 显示的内容( 例如,Flash 、 WindowsMedia 视频 、 流媒体的 RTSP 协议等 ), 因为它们不向服务器提供 referer header, 所以若采用上述的referer 的防盗链手段, 就达不到想要的效果。对于 Flash 、 Windows Media 视频这种占用流量较大的业务数据, 防盗链是比较闲难的, 此时可以采用 Cookie 技术, 解决 Flash 、 Windows Media 视频等的防盗链问题。
3 ) 通过加密变换访问路径实现防盗链
此种方法比较适合视频及下载类业务数据的网站 。
1、针对文件名防盗链
location ~* \.(gif|jpg|png|swf|flv)$ { #需要防盗链资源的文件类型
valid_referers none blocked test.com ; #这是可以盗链的域名或IP地址,一般情况可
以把google,baidu,sogou,soso,bing,feedsky,zhuaxia,photozero等域名放进来
if ($invalid_referer) {
rewrite ^/ http://test.com/retrun.html;
#return 404;
}
}
2、针对图片目录防盗
l
ocation /images/ {
alias /data/images/;
valid_referers none blocked server_names *.xok.la xok.la ; #允许访问该目录的域
名或IP
if ($invalid_referer) {
return 403;
}
}
3、nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链