Nginx-服务配置与优化

Nginx服务配置与优化

1.Nginx配置文件介绍

1.1 配置文件位置

本次配置的nginx配置位于:/usr/local/nginx/conf/nginx.conf

在忘记配置文件的时候可以通过find命令找到对应地址。

[root@local profile.d]# find / -name nginx.conf
/usr/local/nginx/conf/nginx.conf
/software/nginx-1.14.0/conf/nginx.conf

Nginx 的默认配置文件为 nginx.conf

  • nginx -c xxx.conf - 以指定的文件作为配置文件,启动 Nginx。

1.2 nginx配置文件典型结构

#main段配置信息
#定义 nginx 运行的用户和用户组
user nginx nginx;

#nginx 进程数,建议设置为等于 CPU 总核心数。
worker_processes 8;

#nginx 默认没有开启利用多核 CPU, 通过增加 worker_cpu_affinity 配置参数来充分利用多核 CPU 以下是 8 核的配置参数
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致。
worker_rlimit_nofile 65535;

# events段配置信息
events {
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I/O 模型,如果跑在 FreeBSD 上面,就用 kqueue 模型。
    #epoll 是多路复用 IO(I/O Multiplexing) 中的一种方式,但是仅用于 linux2.6 以上内核,可以大大提高 nginx 的性能
    use epoll;
    
    ############################################################################
    #单个后台 worker process 进程的最大并发链接数
    #事件模块指令,定义 nginx 每个进程最大连接数,默认 1024。最大客户连接数由 worker_processes 和 worker_connections 决定
    #即 max_client=worker_processes*worker_connections, 在作为反向代理时:max_client=worker_processes*worker_connections / 4
    worker_connections 65535;
    ############################################################################
}

# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http { 
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的 hash 表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成 off。
    
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
   
   ##连接客户端超时时间各种参数设置##
    keepalive_timeout  120;          #单位是秒,客户端连接时时间,超时之后服务器端自动关闭该连接 如果 nginx 守护进程在这个等待的时间里,一直没有收到浏览发过来 http 请求,则关闭这个 http 连接
    client_header_timeout 10;        #客户端请求头的超时时间
    client_body_timeout 10;          #客户端请求主体超时时间
    reset_timedout_connection on;    #告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间
    send_timeout 10;                 #客户端响应超时时间,在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx 就会关闭连接
   
   ################################
    #FastCGI 相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    ###作为代理缓存服务器设置#######
    ###先写到 temp 再移动到 cache
    #proxy_cache_path /var/tmp/nginx/proxy_cache levels=1:2 keys_zone=cache_one:512m inactive=10m max_size=64m;
    ###以上 proxy_temp 和 proxy_cache 需要在同一个分区中
    ###levels=1:2 表示缓存级别,表示缓存目录的第一级目录是 1 个字符,第二级目录是 2 个字符 keys_zone=cache_one:128m 缓存空间起名为 cache_one 大小为 512m
    ###max_size=64m 表示单个文件超过 128m 就不缓存了  inactive=10m 表示缓存的数据,10 分钟内没有被访问过就删除
    #########end####################
   
   #####对传输文件压缩###########
    #gzip 模块设置
    gzip on; #开启 gzip 压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0)
    gzip_comp_level 2; #压缩等级,gzip 压缩比,1 为最小,处理最快;9 为压缩比最大,处理最慢,传输速度最快,也最消耗 CPU;
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn。
    gzip_vary on;
    ##############################
    #limit_zone crawler $binary_remote_addr 10m; #开启限制 IP 连接数的时候需要使用

    # server段配置信息
    server {
      listen       80;       # 配置监听的端口
      server_name  localhost;    # 配置的域名

      # location段配置信息
      location / {
        root   /usr/share/nginx/html;  # 网站根目录
        index  index.html index.htm;   # 默认首页文件
        deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
        allow 172.168.33.44;# 允许访问的ip地址,可以为all
      }

      error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
      error_page 400 404 error.html;   # 同上
    }
}
  • main:全局配置,对全局生效;
  • events:配置影响 Nginx 服务器与用户的网络连接;
  • http:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
  • server:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
  • location:用于配置匹配的 url ;
  • upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

配置文件整体结构为:
image

1.3 Nginx常用命令

常用到的命令如下:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t            不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本,编译器版本和配置参数。

在使用命令的时候注意将nginx相关命令加入到系统命令库中.

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

2.Nginx服务优化

在进行优化前,如果可以先通过nginx -V查看安装自定义配置的模块。

[root@local conf]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --http-log-path=/data/logs/nginx/access.log --error-log-path=/data/logs/nginx/error.log --with-http_ssl_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_stub_status_module

2.1 隐藏版本号

版本号信息可以通过http模块的配置进行隐藏,从而防止网络攻击根据nginx版本号获知版本漏洞发起攻击。

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;								#添加,关闭版本号
    ......
}

在未进行配置的时候,通过curl -I 查看http信息的头信息。

[root@local profile.d]# curl -I http://192.168.80.20
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Mon, 09 May 2022 09:15:12 GMT
Content-Type: text/html
Content-Length: 25
Last-Modified: Mon, 09 May 2022 08:18:31 GMT
Connection: keep-alive
ETag: "6278ce57-19"
Accept-Ranges: bytes

修改配置后,版本号已隐藏

[root@local conf]# curl -I http://192.168.80.20
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 09 May 2022 09:20:20 GMT
Content-Type: text/html
Content-Length: 25
Last-Modified: Mon, 09 May 2022 08:18:31 GMT
Connection: keep-alive
ETag: "6278ce57-19"
Accept-Ranges: bytes

2.2 缓存图片

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

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	...... 
		location / {
			root html;
			index index.html index.htm;
		}
		
		location ~ \.(gif|jpg|jepg|png|bmp|ico)$ { 		#加入新的 location,以图片作为缓存对象
			root html;
			expires 1d;									#指定缓存时间,1天
		}
......
	}
}

查看响应头中包含 Cahce-Control:max-age=86400 表示缓存时间是 86400 秒。也就是缓存一天的时间,一天之内浏览器访问这个页面,都是用缓存中的数据,而不需要向 Nginx 服务器重新发出请求,减少了服务器的使用带宽。
image

2.3 配置连接超时

HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。

vim /usr/local/nginx/conf/nginx.conf
http {
...... 
    keepalive_timeout 65 180;
    client_header_timeout 80;
    client_body_timeout 80;
    reset_timedout_connection on;
    send_timeout 10;
...... 
}
  • keepalive_timeout
    指定KeepAlive的超时时间(timeout)。指定每个TCP连接最多可以保持多长时间,服务器将会在这个时间后关闭连接。 Nginx的默认值是65秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为0,就禁止了keepalive 连接。
    第二个参数(可选的)指定了在响应头Keep-Alive:timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必去关闭连接了。没有这个参数,Nginx 不会发送 Keep-Alive 响应头。

  • client_header_timeout
    客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。

  • client_body_timeout
    指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。

  • reset_timedout_connection
    告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间

  • send_timeout 10
    客户端响应超时时间,在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx 就会关闭连接。

以上参数灵活按需设置即可。

2.4 配置进程数(并发数)

在高并发场景,需要启动更多的Nginx进程以保证快速响应,以处理用户的请求,避免造成阻塞。理论上单个Nginx应用服务可以支持50000并发,单根据实际情况和硬件设施的限制,单个Nginx服务提供并发数在30000以下。

Nginx并发数受到全局配置中的worker_processes和events配置中的worker_connections参数限制。即max_client=worker_processes*worker_connections

其中worker_processes为Nginx可以使用进程数,一般设置为服务器的cpu内核数,如果cpu有超线程技术,则设置对应的超线程数量,如4核心8线程CPU,该参数设置为8.

Nginx默认没有开启利用多核 CPU, 通过增加 worker_cpu_affinity 配置参数来充分利用多核 CPU 以下是 8 核的配置参数
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

两核心参数配置为
worker_cpu_affinity 01 10;

worker_connection为单个Nginx进程可以处理的连接数。值为1-65535。最大值是由linux单进程最大打开文件数所限制。

该值的查询可以通过下述命令查询。

[root@local conf]# ulimit -n
1024

通过修改/etc/security/limits.conf可以修改。在该文件加入配置项

* soft nofile 65535
* hard nofile 65535

注意:* 要加到文件里面,以上在limits.conf文件中添加的两句话的含义是
soft(应用软件)级别限制的最大可打开文件数的限制
hard表示操作系统级别限制的最大可打开文件数的限制,
*表示所有用户都生效。

修改完该配置后,该选项并非立即生效,在无法重启的时候需要使用ulimit -n临时配置一下。

[root@local conf]# ulimit -n 65535        #配置修改后无法直接生效,所以在不能重启的情况下使用ulimit -n 数字临时设置
[root@local conf]# 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) 14950
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) 14950
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

在完成最后打开文件数的修改后,修改Nginx配置过程应该为。

cat /proc/cpuinfo | grep -c "physical id"	#查看cpu核数
ps aux | grep nginx							#查看nginx主进程中包含几个子进程

vim /usr/local/nginx/conf/nginx.conf
worker_processes  2;				#修改为核数相同或者2倍
worker_cpu_affinity 01 10;			#设置每个进程由不同cpu处理,进程数配为4时0001 0010 0100 1000
…………………………
events{
   …………
   worker_connections 65535;
}


2.5 配置网页压缩(gzip)

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

在未配置gzip压缩的时候,图片大小为1.74MB。

image

配置压缩

vim /usr/local/nginx/conf/nginx.conf
...... 
http {
...... 
   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;		#压缩类型,表示哪些网页文档启用压缩功能
...... 
}

开启后,图片压缩为1.28MB,并在请求头上显示gzip。

image

2.6 配置防盗链

防盗链是指避免其他网站通过网络连接访问服务器上的图片,从而导致主机流量损失。此时我们使用另外一台主机。

首先配置盗链网站。

[root@localhost html]# cat index.html
<img src="http://www.canyun.com/wallhaven-y8lqo7.jpg" />   //获取的是原图

image

在配置20主机的防盗链设置

vim /usr/local/nginx/conf/nginx.conf
http {
......
	server {
	......
	    #~* \.(jpg|gif|swf)$ :这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件;
		location ~* \.(jpg|gif|swf)$ {   
            #valid_referers :设置信任的网站,可以正常使用图片;
			valid_referers none blocked *.canyun.com canyun.com;
			#if语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为true,则执行后面的操作,即进行重写,到防盗链图片
			if ( $invalid_referer ) {
				rewrite ^/ http://www.canyun.com/error.png;
            }
        }
	......
	}
}

刷新并清理缓存,查看25主机是否正常跳转防盗链图片。

image

posted @ 2022-05-15 16:43  残-云  阅读(125)  评论(0编辑  收藏  举报