Nginx优化之一

网友投稿 1197 2022-10-07

Nginx优化之一

安全优化、性能优化、日志优化。

一、Nginx安全优化

1.1:隐藏nginx版本信息

官方配置参数说明:​​ server_tokens on | off | build | string;Default: server_tokens on;Context: server, location

配置举例:

[root@node1 ~]# cat /etc/nginx/nginx.confuser nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events { worker_connections 1024;}{ include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$' '"$"$ access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; server_tokens off;65; #gzip on; include /etc/nginx/conf.d/*.conf;}

测试结果:

[root@node1 ~]# curl -I localhostHTTP/1.1 200Server: nginx09 May 2018 02:38:56 GMTContent-Type: text/htmlContent-Length: 11Last-Modified: Wed, 09 May 2018 02:29:10 GMTConnection: keep-aliveETag: "5af25cf6-b"Accept-Ranges: bytes

1.2:修改nginx版本信息

修改版本信息需要修改程序源文件信息

修改内核信息:

[root@node1 nginx-1.10.2]# vim src/core/nginx.h# ··· 13 #define NGINX_VERSION "1.0" 14 #define NGINX_VER "clsn/" NGINX_VERSION 22 #define NGINX_VAR "clsn"# ···

修改头部信息:

[root@node1 nginx-1.10.2]# vim src/# ··· 49 static char ngx_= "Server: clsn" CRLF;# ···

修改错误页显示:

[root@noode1 nginx-1.10.2]# vim src/# ···# 此处可以不修改 21 static u_char ngx_= 22 "


" NGINX_VER "
" CRLF 23 "" CRLF 24 "" CRLF 25 ;# ··· 28 static u_char ngx_= 29 "
clsn
" CRLF 30 "" CRLF 31 "" CRLF 32 ;# ···

修改完成后重新编译:

[root@node1 nginx-1.10.2]# ./configure --prefix=/application/nginx-1.10.2 --user=--group=--with---with-nginx-1.10.2]# /etc/init.d/nginx restart

访问测试是否修改成功:

[root@node1 ~]# curl -I localhostHTTP/1.1 200 OKServer: clsnDate: Wed, 01 Nov 2017 19:05:43 GMTContent-Type: text/htmlContent-Length: 10Last-Modified: Wed, 25 Oct 2017 01:20:56 GMTConnection: keep-aliveETag: "59efe6f8-a"Accept-Ranges: bytes

1.3:修改work进程的用户

第一种方法:利用编译安装配置参数,设定nginx默认worker进程用户

useradd -s /sbin/nologin -M /configure --user=--group=[group];Default: user nobody nobody;Context: main

配置举例:

[root@web02 conf]# cat nginx.confuser # 主区块添加user参数

查看是否生效:

[root@web01 nginx-1.10.2]# ps -ef|grep nginxroot 16987 1 0 15:14 ? 00:00:00 nginx: master process nginxclsn 18484 16987 0 15:22 ? 00:00:00 nginx: worker processroot 18486 9593 0 15:22 pts/0 00:00:00 grep --color=auto nginx

1.4:上传文件大小的限制(动态应用)

默认语法说明:

syntax:client_max_body_size size; #<==参数语法default:client_max_body_size 1m; #<==默认值是1mcontext: #<==可以放置的标签段

举例配置:

{ sendfile on; keepalive_timeout 65; client_max_body_size 8m; # 设置上传文件最大值8M}

1.5:站点 Nginx站点目录及文件URL访问控制

01. 根据目录或扩展名,禁止用户访问指定数据信息

location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$ { deny all; } location ~ ^/static/.*\.(php|php5|sh|pl|py)$ { deny all; } location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ { deny all; }

02. 当访问禁止的数据信息时,进行页面跳转

Nginx下配置禁止访问*.txt和*.doc文件,实际配置信息如下:

location ~* \.(txt|doc)$ { if (-f $request_filename){ root /data/ #rewrite …..可以重定向到某个URL

03. 根据IP地址或网络进行访问策略控制

location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all;}

04. 采用if判断方式,进行访问控制

if ($remote_addr = 10.0.0.7 ){ return 403; }

1.6:禁止非法域名解析访问企业网站

第一种方式:配置一个server虚拟主机区块,放置在所有server区块最前面

server { listen 80; server_name - ; return 501;}

第二种方式:将计就计,通过你的域名访问时候,自动跳转到我的域名上

server { listen 80 default_server; server_name _; rewrite ^(.*) permanent;}if ($host !~ ^ rewrite ^(.*) permanent;}

1.7:Nginx图片及目录防盗链解决方案

什么是资源盗链 ?

简单地说,就是某些不法网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到填充自身网站的效果。

1.7.1:实现盗链过程:

01. 真正的合法网站(盗链的目标)  web01   nmtui.com 配置静态虚拟主机server { listen 80; server_name nmtui.com; location / { root html/ index index.html index.htm;}# 确认生成盗链文件

02. 不合法的网站(真正盗链网站)

# 编写一个html盗链文件 测试 测试
测试 地址

服务器角色

权限处理

安全系数

动态Web集群

目录权限755

文件权限644

所用的目录,以及文件用户和组都是root

环境为Nginx+PHP   

文件不能被改

目录不能被写入

安全系数10

static图片集群

目录权限755

文件权限644

所用的目录,以及文件用户和组都是root

环境为Nginx   

文件不能被改

目录不能被写入

安全系数10

上传upload集群

目录权限755

文件权限644

所用的目录,以及文件用户和组都是root

用户上传的目录设置为755

用户和组使用Nginx服务配置的用户    

文件不能被改

目录不能被写入

但是用户上传的目录允许写入文件且需要通过Nginx的其他功能来禁止读文件

安全系数8

1.10:Nginx防爬虫优化

范例1:阻止-协议代理,命令如下:

## Block download agents ##if ($~* LWP::Simple|BBBike|wget) { return 403;}

范例2:添加内容防止N多爬虫代理访问网站,命令如下:

这些爬虫代理使用“|”分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:

if ($~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") {return 403;}

1.11:利用Nginx限制HTTP的请求方法

#Only allow these request methods

if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501;}

#Do not accept DELETE,SEARCH and other methods

1.12 使用普通用户启动nginx

1、切换到普通用户家目录下,创建nginx所需文件

[nginx@web01 ~]$ mkdir -p blog/{conf,logs,html}[nginx@web01 ~]$ cd blog/ [nginx@web01 blog]$ cp /application/nginx/conf/nginx.conf.default ./conf/[nginx@web01 blog]$ grep -vE "^$|#" conf/nginx.conf.default > conf/nginx.conf[nginx@web01 blog]$ cp /application/nginx/conf/mime.types conf/

2、编写配置文件

[nginx@web01 ~]$ cat blog/conf/nginx.confworker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;worker_rlimit_nofile 65535;error_log /home/nginx/blog/logs/error.log;user inca inca;pid /home/nginx/blog/logs/nginx.pid;events { use epoll; worker_connections 1024;}{ 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 "$' '"$"$ server { listen 8080; server_name etiantian.org; root /home/nginx/blog/html; location / { index index.html index.htm; } access_log /home/nginx/blog/logs/web_blog_access.log main; }}

注意:普通用户不能使用知名端口,需要使用其他端口启动服务

3、检查配置文件语法,并启动nginx服务

/application/nginx/sbin/nginx -t -c /home/nginx/blog/conf/nginx.conf或/application/nginx/sbin/nginx -c /home/nginx/blog/conf/nginx.conf &>/dev/null &

注意:忽略一些不正确的输出信息

二、Nginx性能优化

2.1:优化nginx worker进行个数

nginx服务主要有两个重要进程:

01 :master进程:可以控制nginx服务的启动 停止 或重启 02: worker进程:处理用户请求信息,帮助用户向后端服务进行请求(php mysql)

添加worker进程方法

# 修改nginx配置文件中worker_processes指令后面的数值

建议:worker进程数量=等于CPU的核数   worker进程数量=等于CPU的核数*2

如何在一个系统中获悉CPU核心是多少?

①. 利用top命令--按数字1,获取到CPU核数信息 ②. grep processor /proc/cpuinfo|wc -l ③. lscpu

查看cpu核心数命令示例

示例一

[root@web01 ~]# top # 按数字1top - 03:22:48 up 9 days, 26 min, 4 users, load average: 1.06, 0.99, 0.92Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombieCpu0 : 0.2%us, 0.6%sy, 0.0%ni, 99.0%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%stCpu1 : 0.1%us, 0.1%sy, 0.0%ni, 99.1%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%stMem: 485984k total, 452536k used, 33448k free, 24984k buffersSwap: 786428k total, 5912k used, 780516k free, 242048k cached

示例二

[root@web01 ~]# lscpu |grep CPU CPU op-mode(s): 32-bit, 64-bitCPU(s): 2

示例三

[root@web01 ~]# grep processor /proc/cpuinfo processor : 0processor : 1

2.2:绑定不同的nginx进程到不同的CPU上

4个worker进程分配CPU资源方法:

worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;

8个worker进程分配CPU资源方法;

worker_processes 8;worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000; # 分配8进程方法

4个worker进程分配CPU资源方法:

worker_processes 4;worker_cpu_affinity 0101 1010; # 将进程分配到两颗CPU上

2.3:优化nginx事件处理模型

官方配置参数说明:​​ use method;Default: —Context: events

举例配置:

user 1;events { worker_connections 1024; use epoll; --- 指定使用的模型为epoll}

2.4:调整nginx单个进程允许的客户端最大连接数

查看nginx当前的打开文件数

[root@clsn ~]# lsof -i:80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 10422 root 6u IPv4 11868856 0t0 TCP *:(LISTEN)nginx 10424 6u IPv4 11868856 0t0 TCP *:(LISTEN)nginx 10425 6u IPv4 11868856 0t0 TCP *:nginx.conf events #<==events指令是设定Nginx的工作模式及连接数上限

说    明:此数值设置不要超过系统最大打开文件数量。

2.5:配置Nginx worker进程最大打开文件数

举例配置:

[root@web02 conf]# cat nginx.confuser 1;worker_rlimit_nofile 2048; # 设置worker进程打开文件数

2.6:优化nginx高效文件传输模式

sendfile参数的官方说明如下:

syntax:sendfile on | off; #<==参数语法default:sendfile off; #<==参数默认大小context:in location #<==可以放置的标签段

说明:在系统内核中,利用零拷贝方式实现数据传输

实现高效数据传输的两种方式

第一种方式:tcp_nopush

syntax: tcp_nopush on | off; #<==参数语法default: tcp_nopush off; #<==参数默认大小context: #<==可以放置的标签段

说明:将数据包积攒到一定量时再进行传输

参数作用:

激活或禁用Linux上的TCP_NODELAY选项。这个参数启用只在连接传输进入到 keep-alive状态。TCP_NODELAY和TCP_CORK基本上控制了包的"Nagle化",Nagle化在这里 的含义是采用Nagle算法把较小的包组装为更大的帧。John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的。   此算法解决的问题就是所谓的silly window syndrome,中文称"愚蠢窗口症候群",具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,很轻易地就能令网络发生拥塞,Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下希望发送小块数据,把这一选项关掉也是合乎需要的。

第二种方式:tcp_nodelay

Syntax: tcp_nodelay on | off;Default: tcp_nodelay on;Context: server, location

说明:只要有数据包产生,不管大小多少,就尽快传输

参数作用:

激活或禁用Linux上的TCP_CORK socket选项,tcp_cork是linux下tcp/ip传输的一个标准了,这个标准的大概的意思是,一般情况下,在tcp交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而tcp_cork选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞,已经是默认了。  此选项仅仅当开启sendfile时才生效, 激活这个.tcp_nopush参数可以允许把response header和响应数据文件的开始部分放在一个文件里发布,其积极的作用是减少网络报文段的数量。

强调:两个指令是相悖的,请选择其一开启,不要同时开启;

默认采用tcp_nodelay方式进行传输。

2.7:设置nginx服务超时参数

1) 设置参数: keepalive_timeout 60; # 长连接才有意义

keepalive_timeout参数的官方说明如下:

syntax:keepalive_timeout timeout [header_timeout]; #<==参数语法default:keepalive_timeout 75s; #<==参数默认大小context: #<==可以放置的标签段

说明:客户端和服务端都没有数据传输时,进行超时时间倒计时,一旦超时时间读取完毕还没有数据传输,就断开连接

2) 设置参数:client_header_timeout 55;

syntax:client_header_timeout time; #<==参数语法default:client_header_timeout 60s; #<==参数默认大小context: #<==可以放置的标签段

说明:表示定义客户端请求报文发送的间隔超时时间,客户端发送的请求报文中请求头信息的间隔时间

3)设置参数:client_body_timeout 55;

syntax:client_body_timeout time; #<==参数语法default:client_body_timeout 60s; #<==默认值是60秒context: #<==可以放置的标签段

说明:表示定义服务端响应报文发送的间隔超时时间,客户端发送的请求报文中请求主体信息的间隔时间

4)设置参数:send_timeout 60s

syntax:send_timeout time; #<==参数语法default:send_timeout 60s; #<==默认值是60秒context: #<==可以放置的标签段

说明:表示定义客户端读取服务端响应报文的间隔超时时间,服务端发送的响应报文间隔时间

2.8:配置Nginx gzip压缩实现性能优化

1.     Nginx gzip压缩功能介绍

Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到用户客户端之前, Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

2.     Nginx gzip压缩的优点

提升网站用户体验:  发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验提升了,网站口碑就好了。节约网站带宽成本:   数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍 微消耗一些CPU资源,这个一般可以忽略。

此功能既能提升用户体验,又能使公司少花钱,一举多得。对于几乎所有的Web服务来说,这 是一个非常重要的功能,Apache服务也有此功能。

官方用法参考链接:​​on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_ 1.1;gzip_comp_level 4;gzip_types text/css text/xml application/javascript;gzip_vary on;

说明:将服务端响应的数据信息进行压缩,可以有效节省带宽,提高用户访问效率

3.     需要和不需要压缩的对象

纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件。被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的。如果再压缩很可能不会减小或减小很少,或者有可能增大,同时压缩时还会消耗大量的CPU、内存资源。

4.     压缩配置参数说明

gzip on ;#<==开启gzip压缩功能。 gzip_min_length lk;#<==设置允许压缩的页面最小宇节数,页面宇节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K,如果小于1K可能会越压越大。 gzip_buffers 4 16k;#<==压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据 大小相同的内存空间来存储gzip压缩结果。 gzip_1.1 ;#<==压缩版本(默认1.1,前端为squid2.5时使用1.0),用于设置识别HTTP协议版本,默认是1.1, 目前大部分浏览器已经支持GZIP解压,使用默认即可。 gzip_comp_level 2 ;#<==压缩比率。用来指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。gzip_types text/plain application/x-javascript text/css application/xml ;#<==用来指定压缩的类型,"text/html"类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。 gzip_vary on ;#<==vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用Squid缓存 经过Nginx压缩的数据。

2.9:配置Nginx expires缓存实现性能优化

简单地说,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器-了,直到缓存的内容过期或被清除为止。

Nginx expires功能优点

expires可以降低网站的带宽,节约成本。加快用户访问网站的速度,提升用户访问体验。服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以节约人力成本。对于几乎所有的Web服务来说,这是非常重要的功能之一,Apache服务也有此功能。

实践配置

[root@web02 extra]# cat blog.conf server { listen 80; server_name blog.etiantian.org; server_tokens off; # 静态请求处理的location location / { root html/blog; index index.php index.html index.htm; } # 动态请求处理的location location ~* .*\.(php|php5)?$ { root html/blog; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10y; root html/blog; } location ~ .*\.(js|css)$ { expires 30d; root html/blog; } } location / { expires 3650d; }

企业网站有可能不希望被缓存的内容

广告图片,用于广告服务,都缓存了就不好控制展示了。网站流量统计工具(JS代码),都缓存了流量统计就不准了。更新很频繁的文件(google的logo),这个如果按天,缓存效果还是显著的。

2.10:配置FastCGI优化

FastCGI Cache资料见:  ​​conf]# cat nginx.confworker_processes 4;worker_cpu_affinity 0001 0010 0100 1000;worker_rlimit_nofile 65535;user nginx;events { use epoll; worker_connections 10240;}{ include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 65; tcp_nodelay on; client_header_timeout 15; client_body_timeout 15; send_timeout 15; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$' '"$"$ server_tokens off; fastcgi_connect_timeout 240; fastcgi_send_timeout 240; fastcgi_read_timeout 240; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #fastcgi_temp_path /data/ngx_fcgi_tmp; fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; #web............... server { listen 80; server_name blog.nmtui.com; root html/blog; location / { root html/blog; index index.php index.html index.htm; } location ~ .*\.(php|php5)${ fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; fastcgi_cache ngx_fcgi_cache; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout invalid_header fastcgi_cache_key } access_log logs/web_blog_access.log main; } upstream blog_etiantian{ server 10.0.0.8:8000 weight=1;} server { listen 8000; server_name blog.nmtui.com; location / { proxy_pass proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log logs/proxy_blog_access.log main; }}

三、Nginx日志优化

3.1:配置Nginx服务相关日志操作

01. 进行日志的切割

[root@clsn ~]# mkdir /server/scripts/ -p[root@clsn ~]# cd /server/scripts/[root@clsn scripts]# vim cut_nginx_log.sh #!/bin/bashcd /application/nginx/logs &&\/bin/mv +%F -d -1day).log #<==将日志按日期改成前一天的名称/application/nginx/sbin/nginx -s reload #<==重新加载nginx使得触发重新生成访问日志文件

提示:实际上脚本的功能很简单,就是改名日志,然后加载nginx,重新生成文件记录日志

说明:也可以编辑使用logrotate日志切割服务,进行日志切割

02. 进行日志的选择记录

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off;}

03. 进行日志文件授权

假如日志目录为/app/logs,则授权方法如下:

chown -R root.root /app/logschmod -R 700 /app/logs

04. 日志信息尽量汇总备份

[root@clsn ~]# zgrep 456 clsn.tar.gz

3.2:查看软件编译时的参数

①. 查看nginx安装时编译了哪些参数

/application/nginx/sbin/nginx -V

②. 查看apache安装时编译了哪些参数

cat /application/apache/build/config.nice /application/apache/bin/apachectl -V #<--也可查看安装时编译信息,但显示的不全

③. 查看mysql安装时编译了哪些参数

grep CONFIGURE_LINE /application/mysql/bin/mysqlbug

PS:mysql二进制包的安装方式,是无法看到编译参数的,默认为空

④. 查看php安装时编译了哪些参数

/application/php/bin/php -i|grep configure

作者:​​HaydenGuo​​

每一个前十年都想不到后十年我会演变成何等模样,可知人生无常,没有什么规律,没有什么必然。

只要我还对新鲜的知识、品格的改进、情感的扩张、有胃口,这日子就是值得度过的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:公司内部实现资源共享(安装包、文档等可方便下载、上传)
下一篇:微信小程序使用radio显示单选项功能【附源码】(微信小程序 radio)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~