nginx的优化和防盗链

一、nginx的优化

1. 隐藏版本号

(1)隐藏版本号的原因

为了安全,如果暴露版本信息,黑客可以通过版本信息,得知该版本存在的漏洞,进而对服务器进行攻击。隐藏版本信息可以避免黑客有的放矢的搞破坏。

(2)查看版本号的方法

方法一:命令“nginx -v”(仅限web服务器)

[root@localhost ~]# nginx -v
nginx version: nginx/1.12.0

方法二:命令“crul -I”

[root@localhost ~]# curl -I 192.168.122.10
HTTP/1.1 200 OK
Server: nginx/1.12.0 #当前nginx版本为1.12
Date: Thu, 12 Aug 2021 13:55:40 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Thu, 12 Aug 2021 02:57:01 GMT
Connection: keep-alive
ETag: "61148dfd-264"
Accept-Ranges: bytes

方法三:linux火狐浏览器查看

  1. 打开火狐浏览器
  2. 右击网页显示区,选择“查看元素”



  3. 选择“网络",点击本次连接

  4. 输入网页地址

  5. 查看消息头

方法四:windows通过fiddler软件查看

  1. 打开fiddlder
  2. 打开浏览器,输入网页地址
  3. fiddler中点击Inspectors,选择Headers

(3)隐藏方法一:修改配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

http {
......
server_tokens off; #添加此行内容,关闭版本号的显示
...... [root@localhost ~]# systemctl restart nginx



(4)隐藏方法二:修改源码文件,重新编译

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

http {
......
#server_tokens off; #注释此行内容,开启版本号的显示
...... [root@localhost ~]# vim /opt/nginx-1.12.0/src/core/nginx.h #define NGINX_VERSION "2.4.29"
##修改版本号,可伪装成其他服务器版本(例如apache、iis等)
#define NGINX_VER "apache/" NGINX_VERSION
##修改服务器类型,可伪装成其他服务器版本(例如apache、iis等) [root@localhost ~]# cd /opt/nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module
[root@localhost nginx-1.12.0]# make -j 2 && make install
[root@localhost nginx-1.12.0]# systemctl restart nginx



2. 修改用户与组

[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf

user  nginx nginx;         #第二行,取消注释,修改用户为nginx,组为nginx

[root@localhost nginx-1.12.0]# systemctl restart nginx
[root@localhost nginx-1.12.0]# ps aux | grep nginx
#主进程由root创建,子进程由nginx创建
root 42095 0.0 0.0 20500 628 ? Ss 23:29 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 42096 0.0 0.0 22948 1404 ? S 23:29 0:00 nginx: worker process
root 42103 0.0 0.0 112676 976 pts/0 R+ 23:29 0:00 grep --color=auto nginx

3. 缓存时间

当nginx将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容的请求时直接返回,避免重复请求,加快了访问速度。一般针对静态网页进行设置,对动态网页不设置缓存时间。

[root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf

......
server {
......
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ { #新建location,以图片作为缓存对象
root html;
expires 1d; #指定缓存时间为1天
}
......
}
...... [root@localhost nginx-1.12.0]# systemctl restart nginx

在网页中加入图片后测试

[root@localhost html]# vim /usr/local/nginx/html/index.html 

#加入图片
</h1>
<img src="jobs.jpeg"/>
</body></html>







4. 日志切割

  1. 编写脚本
[root@localhost html]# vim /opt/log_cut.sh 

#!/bin/bash
#Filename:log_cut.sh lastday=$(date -d "-1 day" +%Y%m%d)
#显示前一天的时间
logs_path=/var/log/nginx
pid_path=/usr/local/nginx/logs/nginx.pid [ -d $logs_path ] || mkdir -p $logs_path
#创建日志文件目录
mv /usr/local/nginx/logs/access.log $logs_path/test.com_access.log-$lastday
mv /usr/local/nginx/logs/error.log $logs_path/test.com_error.log-$lastday
#移动并重命名日志文件 kill -USR1 $(cat $pid_path)
#重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;
#删除30天之前的日志文件
  1. 脚本执行测试
[root@localhost html]# chmod +x /opt/log_cut.sh
[root@localhost html]# cd /opt
[root@localhost opt]# ./log_cut.sh
[root@localhost opt]# cd /var/log/nginx
[root@localhost nginx]# ls
test.com_access.log-20210813 test.com_error.log-20210813
  1. 加入计划任务
[root@localhost nginx]# crontab -e

0 1 * * * /opt/log_cut.sh

crontab: installing new crontab
[root@localhost nginx]# crontab -l
0 1 * * * /opt/log_cut.sh
  1. 补充-ctime/atime/mtime

    在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较常用,分别是ctime、atime、mtime。
时间参数 说明
ctime 当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,更像是change time,只有当更新文件的属性或者权限的时候才会更新这个时间,但是更改内容的话不会更新这个时间
atime 当使用这个而文件的时候就会更新这个时间
mtime 当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别

5. 连接超时

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP链接的打开状态。若接收到来自同一客户端的其他请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。

KeepAlive在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响性能。

[root@localhost nginx]# vim /usr/local/nginx/conf/nginx.conf

http {
......
keepalive_timeout 65 180;
client_header_timeout 80;
client_body_timeout 80;
......
} [root@localhost nginx]# systemctl restart nginx



设定参数 说明
keepalive_timeout 指定KeepAlive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。Nginx的默认值是65秒,有些浏览器最多只保持60秒,所以可以设定为60秒。若将它设置为0,就禁止了keepalive连接。
第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Ngnix不会发送Keep-Alive响应头
clinet_header_timeout 客户端向服务端发送一个完整的request header,Nginx返回HTTP 408(Request Time Out)
client_body_timeout 指定客户端与服务端建立连接后发送request body的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx返回HTTP 408(Request Time Out)

6. 更改进程数

在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞。

[root@localhost nginx]# nproc --all
#显示所有CPU数目
2
[root@localhost nginx]# nproc
#显示当前进程可用的CPU数目
2
[root@localhost nginx]# ps aux | grep nginx
#查看nginx主进程中包含几个子进程
root 3383 0.0 0.0 20500 640 ? Ss 17:34 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 3384 0.0 0.0 22948 1656 ? S 17:34 0:00 nginx: worker process
root 3742 0.0 0.0 112676 980 pts/0 R+ 18:09 0:00 grep --color=auto nginx
[root@localhost nginx]# vim /usr/local/nginx/conf/nginx.conf worker_processes 2;
#修改为核数相同或者2倍
worker_cpu_affinity 01 10;
设置每个进程由不同cpu处理,进程数配为4时设置为0001 0010 0100 1000
#worker_rlimit_nofile 65535; events {
worker_connections 4096;
#单个工作进程可以允许同时建立外部连接的数量
} [root@localhost nginx]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7822
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
#
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7822
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@localhost nginx]# ulimit -n 65535
[root@localhost nginx]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7822
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7822
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@localhost nginx]# systemctl restart nginx
  1. connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
  2. 内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
  3. 进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,

    nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 65535,相当于ulimit -n 65535。

7. 配置网页压缩

Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。允许Nginx服务器将输出内容在发送客户端之前进行压缩,以节约网站带宽,提升用户的访问体验,默认已经安装,可在配置文件中加入相应的压缩功能参数对压缩性能进行优化。

[root@localhost nginx]# vim /usr/local/nginx/conf/nginx.conf

......
gzip on;
#取消注释,开启gzip压缩功能
gzip_min_length 1k;
#最小压缩文件大小
gzip_buffers 4 64k;
#压缩缓冲区,大小为4个64k缓冲区
gzip_http_version 1.1;
#压缩版本(默认为1.1,前端如果是squid2.5需使用1.0)
gzip_comp_level 6;
#压缩比率
gzip_vary on;
#支持前端缓存服务器存储压缩页面
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;
#压缩类型,表示哪些网页文档启用压缩功能
...... [root@localhost nginx]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx]# systemctl restart nginx



二、防盗链

  1. 配置基于域名的虚拟web服务器并配置防盗链
[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf

http {
......
server {
......
location ~* \.(jpeg|gif|jpg|swf)$ {
#匹配不区分大小写,以.jpeg/.gif/.jpg/.swf结尾的文件
valid_referers none blocked *.test.com test.com;
#设置信任的网站,可以正常使用以上文件
#none为允许没有http_refer的请求访问资源(根据referer的定义,它的作用是指示一个请求是从哪里链接过来的,如果直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含referer字段的,例如http://www.test.com/jobs.jpeg)
#我们使用http://www,test.com访问显示的图片,可以理解成http://www.test.com/jobs.jpeg这个请求是从http://www.test.com这个链接过来的
#blocked允许不是http://开头的,不带协议的请求访问资源
#*.test.com只允许来自指定域名的请求访问资源,如http://www.test.com
if ( $invalid_referer ) {
rewrite ^/ http://www.test.com/error.png;
#return 403;
#如果链接的来源域名不再valid_referers所列出的列表中,$invalid_referer为ture,则执行后面的操作,即执行后面的操作,即进行重写或返回403页面
}
}
......
} server {
#配置盗链服务器
listen 80;
server_name www.daolian.com; charset utf-8; access_log logs/abc.access.log; location / {
root /var/www/html;
index index.html index.htm;
}
}
} [root@localhost html]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost html]# systemctl restart nginx
[root@localhost html]# echo "192.168.122.10 www.test.com www.daolian.com" >> /etc/hosts
  1. 配置盗链网页
[root@localhost html]# mkdir -p /var/www/html
[root@localhost html]# vim /var/www/html/index.html this is a “盗链” test
</h1>
<img src="http://www.test.com/jobs.jpeg"/>
</body>
</html>
  1. 防盗测试







nginx的优化和防盗链的更多相关文章

  1. Nginx的优化与防盗链

    Nginx的优化与防盗链 1.隐藏版本号 2.修改用户与组 3.缓存时间 4.日志切割 5.连接超时 6.更改进程数 7.配置网页压缩 8.配置防盗链 9.fpm参数优化 1.隐藏版本号: 可以使用 ...

  2. 16.Nginx优化与防盗链

    Nginx优化与防盗链 目录 Nginx优化与防盗链 隐藏版本号 修改用户与组 缓存时间 日志切割 小知识 连接超时 更改进程数 配置网页压缩 配置防盗链 配置防盗链 隐藏版本号 可以使用 Fiddl ...

  3. nginx rewrite重写与防盗链配置

    nginx rewrite重写规则与防盗链配置方法 时间:2016-02-04 15:16:58来源:网络 导读:nginx rewrite重写规则与防盗链配置方法,rewrite规则格式中flag标 ...

  4. Nginx Rewrite相关功能-防盗链

    Nginx Rewrite相关功能-防盗链 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. Nginx 十大优化 与 防盗链

    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Ngin ...

  6. Nginx优化与防盗链

    目录: 一.隐藏版本号 二.修改用户与组 三.缓存时间 四.日志切割 五.连接超时 六.更改进程数 七.配置网页压缩 一.隐藏版本号 可以使用 Fiddler 工具抓取数据包,查看 Nginx版本 也 ...

  7. Nginx目录保护、防盗链、限速及多域名处理

    http://www.opsers.org/server/nginx-directory-protection-anti-hotlinking-processing-speed-and-multi-d ...

  8. Nginx详解十三:Nginx场景实践篇之防盗链

    防盗链: 目的:防止资源被盗用 防盗链设置思路 首要方式:区别哪些请求是非正常的用户请求 基于http_refer防盗链配置模块(判断refer(上一步的链接)信息是否为允许访问的网站) 配置语法:v ...

  9. Nginx服务器的图片防盗链

    全站的防盗链方法 在/usr/local/webserver/nginx/conf//vhost/xxxx.conf文件要添加防盗链的server段里添加下面的代码: location ~ .*\.( ...

随机推荐

  1. MySQL删除数据库或表(DROP DATABASE/table语句)

    DROP DATABASE [ IF EXISTS ] <数据库名> DROP table[ IF EXISTS ] <数据库表名> 语法说明如下: <数据库名>: ...

  2. [Win32] UAC用户账户控制 (提权)

    最近写程序时遇到一个问题,就是当一个程序需要管理员权限才能正常运行该怎么办? 通过查阅多方资料,我总结出来几个比较实用的办法(每种办法实现方法不同,同时功能上也有一些小小的差异) 方法一(批处理脚本) ...

  3. 简述伪共享和缓存一致性MESI

    什么是伪共享 计算机系统中为了解决主内存与CPU运行速度的差距,在CPU与主内存之间添加了一级或者多级高速缓冲存储器(Cache),这个Cache一般是集成到CPU内部的,所以也叫 CPU Cache ...

  4. ​第3届云原生技术实践峰会(CNBPS 2020)重磅开启,“原”力蓄势待发!

    CNBPS 2020将在11月19-21日全新启动!作为国内最有影响力的云原生盛会之一,云原生技术实践峰会(CNBPS)至今已举办三届. 在2019年的CNBPS上,灵雀云CTO陈恺喊出"云 ...

  5. 一站式搭建 GitHub Pages 博客 (一)

    本文将详细讲解如何快速搭建 GitHub Pages 博客页面 关于博客主题,博客信息更改,上传文章等将会在 一站式搭建 GitHub Pages 博客 (二) 中进行详细讲解 准备阶段 注册 Git ...

  6. Quay v3.5.1 部署踩坑

    官方文档好久没更新了 拿来部署了一个最新的软件 把我坑死了 首先你需要一个podman OR docker 官方用podman 本文同 设置 Postgres 官方推荐数据库 $ mkdir -p $ ...

  7. linux下玩转磁盘管理与挂载硬盘

    前言 本文将带来linux下的磁盘管理中的硬盘挂载,Linux操作系统挂载硬盘需要了解的一些知识.这可能是迄今为止介绍的最最最实用的linux硬盘挂载的文章了,比较详细.由于工作原因,平时使用的比较多 ...

  8. 超详细的编码实战,让你的springboot应用识别图片中的行人、汽车、狗子、喵星人(JavaCV+YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 《剑指offer》面试题20. 表示数值的字符串

    问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...

  10. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...