[TOC]
# 基本安全优化
## 隐藏版本信息
软件的漏洞都和版本相关,要隐藏或消除web服务对访问用户显示的各种敏感信息。
![](https://img.kancloud.cn/c7/f6/c7f63e5c1f22afb5d605dd4a9b4bf25e_337x131.png)
修改 nginx.conf:
~~~text
http {
……
server_tokens off; # 关闭 Nginx 版本号
……
~~~
# 常用配置优化
## worker_processes
工作进程的数量, 一般设置成 CPU 核的数量。同时配合 `worker_cpu_affinity` (用于worker process与指定cpu核绑定)。
例:
~~~shell
# 分别给每个worker进程绑定一个CPU.
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 将CPU0/CPU2绑定给第一个worker进程,将CPU1/CPU3绑定给第二个worker进程。
worker_processes 2;
worker_cpu_affinity 0101 1010;
~~~
> 一般设置为 `auto` (自动检测)
## worker_connections
单个进程允许的客户端最大连接数。
~~~text
events {
……
worker_connections 1024;
……
}
~~~
## 配置nginx worker进程最大打开文件数
`worker_rlimit_nofile` 改变nginx 工作进程能打开的最大文件数。受系统文件的最大打开数限制。
~~~shell
# 查看系统文件的最大打开数
[root@admin nginx]# cat /proc/sys/fs/file-max
1299568
# 文件系统最大可打开文件数
[root@admin nginx]# ulimit -n
1024
~~~
配置:
~~~
……
events {
……
worker_rlimit_nofile 2048;
~~~
## 开启高效文件传输模式
设置参数`sendfile on`
用于开启文件的高效传输模式。同时将`tcp_nopush`和`tcp_nodelay`两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。
~~~text
http {
……
sendfile on;
tcp_nopush on;
tcp_nodelay on;
~~~
## 配置 Gzip 压缩
nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。
> https://nginx.org/en/docs/http/ngx_http_gzip_module.html
### 压缩的对象
* 纯文本内容压缩比很高,因此,纯文本的内容最好要压缩
* 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大
* 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源
### 配置参数
~~~text
http {
……
##
# Gzip Settings
##
gzip on;
gzip_vary on; # vary header支持
# gzip_proxied any;
gzip_comp_level 6; # 压缩比率
gzip_buffers 16 8k; # 压缩缓存区大小
gzip_http_version 1.1; # 压缩版本
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定压缩的类型
~~~
## nginx expires功能
为用户访问网站的内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及之后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过期或者被清除为止。
### 作用和优点
* 可以降低网站的带宽,节约成本
* 加快用户访问网站的速度,提升了用户访问体验
* 服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低
### 配置详解
~~~text
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
expires 360d;
}
~~~
### 缺点
当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容。
* 对于经常需要的变动图片等文件,可以缩短对象缓存时间
* 当网站改版或更新内容时,可以在服务器将缓存的对象改名
## nginx日志的优化
* 编写脚本实现日志轮询
以通过利用脚本开发、nginx的信号控制功能或reload重新加载,来实现日志的自动切割、轮询
~~~shell
mv www_access.log www_access_$(date +F -d -1day).log
nginx -s reload
~~~
* 不记录不需要的日志
对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,一般不需要记录下来
* 访问日志的权限设置
假如日志目录为/app/logs,则授权方法为:
~~~shell
chown -R root.root /app/logs
chmod -R 600 /app/logs
~~~
不需要在日志目录上给nginx用户读写或者读写许可
## Nginx站点目录及文件URL访问控制
### 根据扩展名限制程序和文件访问
web2.0时代,绝大多数网站都是以用户为中心的,这些产品有一些共同点,就是不允许用户发布内容到服务器,还允许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。
下面将利用nginx配置禁止访问上传资源目录下的 `php`,`shell`,`perl`,`python`程序文件,这样就算是用户上传了木马文件也没办法执行
~~~text
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服务配置的前面
### 禁止访问指定目录下的所有文件和目录
配置禁止访问指定的单个或多个目录
~~~text
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
~~~
禁止访问目录并且返回代码404
~~~text
server {
listen 80;
server_name xxxxx;
root /var/www/xxxxx;
index index.html index.htm;
access_log /var/logs/www_access.log commonlog;
location /admin/ { return 404; }
location /templates/ { return 403; }
}
~~~
### 限制网站来源的IP访问
使用[`ngx_http_access_module`](https://nginx.org/en/docs/http/ngx_http_access_module.html)限制网站来源IP访问。
`allow`:允许,`deny`:拒绝
~~~text
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
~~~
### 配置nginx禁止非法域名解析访问网站
防止用户IP访问网站(恶意域名解析,相当于直接使用IP访问网站)
~~~text
server {
listen 80 default_server;
server_name _;
return 501;
}
~~~
## nginx图片防盗链解决方案
* 根据HTTP referer实现防盗链
* 根据cookie防盗链
利用Nginx [`ngx_http_referer_module`](https://nginx.org/en/docs/http/ngx_http_referer_module.html)模块,用于阻止对“Referer”标头字段中具有无效值的请求的访问。
~~~text
location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ {
valid_referers none blocked *.xxx.com;
if ($invalid_referer) {
return 404;
}
}
~~~
`valid_referers [none|blocked|server_names|string ...] `
默认值:none
none:请求标头中缺少“Referer”字段;
blocked:“Referer”字段存在于请求标头中,但其值已被防火墙或代理服务器删除;此类值是不以“ http://”或“ https://”开头的字符串;
server_names:“Referer”请求标头字段包含服务器名称之一;
# 使用CDN做网站内容加速
* 本地Cache加速
提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性
* 镜像服务
消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量
* 远程加速
远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度
* 带宽优化
自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能。
* 集群抗攻击
广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种D.D.o.S攻击对网站的影响,同时保证较好的服务质量 。
- PHP
- PHP 核心架构
- PHP 生命周期
- PHP-FPM 详解
- PHP-FPM 配置优化
- PHP 命名空间和自动加载
- PHP 运行模式
- PHP 的 Buffer(缓冲区)
- php.ini 配置文件参数优化
- 常见面试题
- 常用函数
- 几种排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常见问题
- MySQL 索引
- 事务
- 锁机制
- Explain 使用分析
- MySQL 高性能优化规范
- UNION 与 UNION ALL
- MySQL报错:sql_mode=only_full_group_by
- MySQL 默认的 sql_mode 详解
- 正则表达式
- Redis
- Redis 知识
- 持久化
- 主从复制、哨兵、集群
- Redis 缓存击穿、穿透、雪崩
- Redis 分布式锁
- RedisBloom
- 网络
- 计算机网络模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常见几种网络攻击方式
- Nginx
- 状态码
- 配置文件
- Nginx 代理+负载均衡
- Nginx 缓存
- Nginx 优化
- Nginx 配置 SSL 证书
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 进程管理
- CentOS与Ubuntu系统区别
- Java
- 消息队列
- 运维
- RAID 磁盘阵列
- 逻辑分区管理 LVM
- 业务
- 标准通信接口设计
- 业务逻辑开发套路的三板斧
- 微信小程序登录流程
- 7种Web实时消息推送方案
- 用户签到
- 用户注册-短信验证码
- SQLServer 删除同一天用户重复签到
- 软件研发完整流程
- 前端
- Redux
- 其他
- 百度云盘大文件下载
- 日常报错记录
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客户端无法连接SVN服务器,主机积极拒绝
- Python
- 基础
- pyecharts图表
- 对象
- 数据库
- PySpark
- 多线程
- 正则
- Hadoop
- 概述
- HDFS