Nginx 配置优化、日志分割

本文详细介绍了Nginx服务器的优化策略,包括日志管理、性能调优、事件模型优化、连接管理、压缩技术、防盗链设置等关键环节,旨在提高Nginx的运行效率和服务质量。

Nginx 优化

1. Nginx日志分割

生产环境中的服务器,由于访问日志增长素的非常快,日志太大会严重影响服务器的效率,同时,为了方便对日志进行分析计算,必须对日志文件进行定时切割,定时切割的方式有 按月切割、按天切割、按小时切割等等。当然了最常用的还是 按天切割。

[root@localhost logs]# pwd
/usr/local/nginx/logs
[root@localhost logs]# mv access.log 20200224.log
[root@localhost logs]# kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
[root@localhost logs]# ls
20200224.log  access.log  error.log  nginx.pid

首先通过 mv 命令将日志文件重新命名 为 20200224.log ,然后发送 kill -USR1 信号给 Nginx 主进程号


PS: Nginx 信号控制

  • TERM,INT 快速关闭
  • QUIT 从容关闭
  • HUP 平滑重启,重新加载配置问价
  • USR1 重新打开日志文件,多用于切割日志
  • USR2 平滑升级可执行程序
  • WINCH 从容关闭工作进程。

2. 修改 Nginx worker_processes

  • 在配置文件中修改 worker_processes ,表示CPU核心数, 使用worker_cpu_affinity 与指定CPU绑定

    • worker_cpu_affinity 对应的 多核CPU

    • 例子: 使用了两个CPU, 01表示第一个进程使用 第一个CPU,10表示第二个进程使用第二个CPU

      worker_processes     2;
      worker_cpu_affinity 01 10;
      
    • 例子: 使用了 4个CPU ,0001表示第一个进程使用第一个CPU,0010第二个进程使用第二CPU,一次类推

      worker_processes     4;
      worker_cpu_affinity 0001 0010 0100 1000;
      
    • worker_cpu_affinity详情可参考:https://blog.csdn.net/u011957758/article/details/50959823

  • 表示有两个CPU,四个进程

    • 01 第一个进程使用 第一个cpu, 10 第二个进程使用第二个 CPU, 01 第三个进程使用 第一个CPU …………
worker_processes     2;
worker_cpu_affinity 01 10 01 10;
  • 查看CPU核心数

    grep processor /proc/cpuinfo | wc -l
    
    2
    

3. Nginx 事件模型处理优化

​ nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型

​  要根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epoll |dev/pool |select |pllo ];”我们使用的是Centos7.3的linux,因此将nginx的事件处理模型调整为epoll模型。

  • worker_connections 表示每个进程的并发连接数,默认为 1024
events {
    worker_connections  4069;
    use epoll;
}

4. 优化Nginx worker 进程打开的最大文件数

  • worker_rlimit_nofile 65535;
    • worker 进程打开的最大文件数
worker_rlimit_nofile 65535;
  • 程序限制只能打开1024个文件

    使用 ulimit -n 65535调整一下

    或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效)


5. 开启高效文件传输模式

  • 设置参数 sendfile on;
    • sendfile参数用于开启文件的高效传输模式
    • 同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率
http {
  sendfile        on;     #放在http,server,location都可以
  #tcp_nopush		on;			防止网络以及磁盘I/O阻塞(减少网络使用量)

	tcp_nodelay		on;			防止网络以及磁盘I/O祖册(发送数据时,内个将多个包合成一个包进行发送,,减少I/O消耗)	
}

6. FastCGI 参数调优

  • 当LNMP 组合工作时,用户通过浏览器输入域名请求Nginx web 服务

    • 如果请求的是静态资源,则有Nginx解析后直接返回给用户
    • 如果是动态请求,那么Nginx就会通过 FastCGI接口发送给PHP引擎服务(php-fpm)进行解析,如果这个动态数据需要读取数据库数据,那么PHP就会继续请求MySQL的数据,将读取的数据,最后返回给Nginx
  • 在 Linux 中,FastCGI 接口为 socket,这个socket可以是文件、也可以是ip socket

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    fastcgi_connect_timeout  240;    # Nginx服务器和后端FastCGI服务器连接的超时时间
    fastcgi_send_timeout     240;    # Nginx允许FastCGI服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接
    fastcgi_read_timeout     240;    # Nginx从FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间
    fastcgi_buffer_size      64k;    # Nginx FastCGI 的缓冲区大小,用来读取从FastCGI服务器端收到的第一部分响应信息的缓冲区大小
    fastcgi_buffers        4 64k;    # 设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量
    fastcgi_busy_buffers_size    128k;    # 用于设置系统很忙时可以使用的 proxy_buffers 大小
    fastcgi_temp_file_write_size 128k;    # FastCGI 临时文件的大小
#   fastcti_temp_path            /data/ngx_fcgi_tmp;    # FastCGI 临时文件的存放路径
    fastcgi_cache_path           /data/ngx_fcgi_cache  levels=2:2  keys_zone=ngx_fcgi_cache:512m  inactive=1d  max_size=40g;    # 缓存目录
     
    server {
        listen       80;
        server_name  www.tianci.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        location ~ .*\.(php|php5)?$ {
            root            html/www;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            include         fastcgi.conf;
            fastcgi_cache   ngx_fcgi_cache;            # 缓存FastCGI生成的内容,比如PHP生成的动态内容
            fastcgi_cache_valid      200  302  1h;     # 指定http状态码的缓存时间,这里表示将200和302缓存1小时
            fastcgi_cache_valid      301  1d;          # 指定http状态码的缓存时间,这里表示将301缓存1天
            fastcgi_cache_valid      any  1m;          # 指定http状态码的缓存时间,这里表示将其他状态码缓存1分钟
            fastcgi_cache_min_uses   1;                # 设置请求几次之后响应被缓存,1表示一次即被缓存
            fastcgi_cache_use_stale  error  timeout  invalid_header  http_500;    # 定义在哪些情况下使用过期缓存
            fastcgi_cache_key        http://$host$request_uri;                    # 定义 fastcgi_cache 的 key
        }
    }
}

7. 对连接进行优化

  • 开启长连接状态下,客户端不进行任何操作,则断开长接连,避免客户端浪费系统资源

    1) 将无用连接尽快超时,保证服务器资源高效使用

    2) 当连接诶较多是,及时断掉空闲连接诶,保护服务器资源高可用状态

 	keepalive_timeout  65;			# 保持连接的超时时间
    client_header_timeout	30;		# 设置读取客户机请求头部数据的超时时间
## 如果在读取客户端头部数据请求信息过多时,没有在规定时间内读取完成,返回给客户端408 服务端超时;;以下选项一样
    client_body_timeout	30;		# 设置读取客户机请求主体的超时时间
    send_timeout	30;			# 用于指定响应客户端的超时时间
    client_max_body_size 1M;	 # 设置客户端请求主体的最大体积

8. 压缩文件

  • 1) 提升用户体验,发送给用户的数据小,打开网页速度更快

    2)节约网站带宽成本,减少流量损失

    3)选择压缩或者不压缩的内容

   gzip  on;					# 开启压缩功能
   gzip_min_length		1k		 # 允许压缩的最小字节数
   gzip_comp_level  [1-9]		  # 设置压缩比,压缩比越大处理文件的速度越慢,反之越快;;一般设置为6
   gzip_varry  on;				# 可以让前端的缓存服务器经过gzip压缩页面
   gzip_types		text/plain		application/x-javascript test/css  application/xmll
# 选择将要压缩的文件类型;; test/html页面总是被压缩(默认)

9. Rewrite 跳转

  • 在 server 进行添加跳转模块,可以让访问直接跳转到指定页面

    • http { server { rewrite } }
  • 正则表达式:

    ^ 匹配输入字符串的开始位置

    $ 匹配输入字符串的结束位置

    • 匹配*前面的字符串0次或多次

    ? 匹配?前面 的字符零次或一次

    permanent 返回301永久跳转

    redirect 返回302临时跳转,浏览器显示跳转后的URL地址

1) 修改配置文件
[root@localhost nginx]# pwd

/usr/local/nginx

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

 server {

​        listen       80;

​        server_name  www.haha.com;

……

}

​     server {

​        listen  80;

​        server_name www.tianci.com;

​        rewrite ^/(.*) http://www.haha.com/$1 permanent;

#   凡是访问 www.cjk.com域名的的任何内容都将跳转至 www.haha.com网页, 

​        location / {

​                proxy_pass http://www_server_pools;}
2) 添加DNS 解析
[root@localhost nginx]# echo "1.1.1.101 www.haha.com" >> /etc/hosts
3) 重启服务
killall nginx
nginx

10. 通过 location 模块指定访问对应URL 获取到不同的结果

  • location

    根据用户请求的URL执行不同的应用( URL本地址)

  server {
        listen 80;
        server_name www.aaa.com;
        root /var/www/aaa;

        location / {
                return 401;
        }
        location = / {
                return 402;
        }
        location /documents/ {
                return 403;
        }
        location ^~/images/ {
                return 404;
        }
#  当用户访问 域名返回 401(没有权限)
#  当用户访问域名下的目录返回 402
#  当用户访问域名下的 documents 返回 403(j禁止访问)
#  当用户访问域名下的 images 返回 404(网页不存在)

11. 隐藏服务的版本号与服务标识

  • 在访问web服务器时显示出来的版本号,容易被黑客找到对应的版本漏洞攻击web服务器
1) 隐藏版本号
  • 查看Nginx 默认显示的版本号
    • 这样很容被人攻击
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Server: nginx/1.12.2
Date: Sat, 21 Mar 2020 06:01:07 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive

  • 修改 Nginx 配置文件
    • 进入nginx配置文件的目录,在http { }段里加上`server_tokens off;
http {
    server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;
    
  • 如果有PHP,则需要隐藏在 PHP信息中的版本号
    • 修改 fastcgi_params文件
      • 将里面的 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 改为 fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version

改为

fastcgi_param SERVER_SOFTWARE nginx;
  • 重启nginx
killall nginx
nginx
  • 再次查看
    • 我们会发现版本信息,没有了,但是还有Nginx标识
[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Server: nginx
Date: Sat, 21 Mar 2020 06:03:36 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive

2) 修改 Nginx 标识与版本信息
  • 修改源码文件中的 src/core/nginx.h
    • 加入把Nginx 改为 Tomcat
[root@localhost ~]# cd /usr/src/nginx-1.12.2/
[root@localhost nginx-1.12.2]# vim src/core/nginx.h 


/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#ifndef _NGINX_H_INCLUDED_
#define _NGINX_H_INCLUDED_


#define nginx_version      1012002
#define NGINX_VERSION      "999.999.999"			
	# 修改版本号
#define NGINX_VER          "Tomcat/" NGINX_VERSION
	# 修改 Nginx 标识

#ifdef NGX_BUILD
#define NGINX_VER_BUILD    NGINX_VER " (" NGX_BUILD ")"
#else
#define NGINX_VER_BUILD    NGINX_VER
#endif

#define NGINX_VAR          "NGINX"
#define NGX_OLDPID_EXT     ".oldbin"


#endif /* _NGINX_H_INCLUDED_ */

  • 重新编译安装即可
make install
  • 注意 如果 server_tokens 设置为 OFF ,则不会显示效果,需要把server_tokens 去掉

  • 查看

[root@localhost ~]# curl -I 127.0.0.1
HTTP/1.1 404 Not Found
Server: Tomcat/999.999.999
Date: Sat, 21 Mar 2020 06:14:26 GMT
Content-Type: text/html
Content-Length: 175
Connection: keep-alive

12. 配置 Nginx防盗链

  • 防盗链是其他网站未经许可,通过自身网站程序非法调用其他网站的资源,然后在自己网页上显示这些调用的资源,使得被盗链路的那一段消耗资源带宽。

  • 通过 匹配后缀实现防盗

location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ {    
		# 指定需要使用防盗链的媒体资源
    access_log  off;                                              
    	# 不记录日志
    expires  15d;                                                 
    	# 设置缓存时间
    valid_referers  none  blocked  *.test.com  *.abc.com;         
    	# 表示仅允许这些域名访问上面的媒体资源
    if ($invalid_referer) {                                       
    	# 如果域名不是上面指定的地址就返回403
        return 403
    }
}
  • 通过绑定目录 实现防盗
location /images {  
    root /web/www/img;
    vaild_referers none blocked *.spdir.com *.spdir.top;
    if ($invalid_referer) {
        return 403;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值