Nginx 在高并发下如调优?看完这篇就够了!

文章目录

  • 一、你用 Nginx 做过哪些关于配置(优化)?
    • ①隐藏版本号
    • ②修改用户与组
    • ③配置网页缓存时间
    • ④日志切割
    • ⑤设置连接超时(会话保持)
    • ⑥更改进程数
    • ⑦配置网页压缩
    • ⑧配置防盗链
    • ⑨FPM 参数优化
  • 二、小结

复习一下:

在各种网站服务器软件中,除了 Apache HTTP Server 外,还有一款轻量级的 HTTP 服务器软件——Nginx

  1. 轻量级体现在低系统资源消耗方面,所占用内存较小

  2. 在连接高并发的情况下,Nginx 是 Apache 服务很不错的替代品,其应对 HTTP 并发连接的高性能处理能力(单台物理服务器可支持 30000~50000 个并发请求)也是其另外一个重要的优点


一、你用 Nginx 做过哪些关于配置(优化)?

默认的 Nginx 安装参数只提供最基本的服务,还需要我们继续深入优化才能发挥出服务器最大的作用,适应生产环境

①隐藏版本号

在生产环境中,需要隐藏 Nginx 的版本号,避免黑客根据特定的版本号进行攻击
比如你没有及时更新,版本号又暴露在外面,漏洞总是会被人慢慢找出来的
举个例子,比如市场上那么多的破解版本软件资源
--
vim /usr/local/nginx/conf/nginx.conf
server_tokens off;		//关闭版本号
--
systemctl restart nginx.service
curl -I http://[Nginx服务器IP]		//查看版本号信息
#curl的作用是发出网络请求,然后获取数据,“-I”选项是只显示服务器返回的HTTP头部信息

----
还有一种方法,相当于“修改”版本号,“混淆”黑客?
vim /opt/nginx-1.12.0/src/core/nginx.h
#define NGINX_VERSION "1.0.0"				//修改版本号
#define NGINX_VER "IIS" NGINX_VERSION		//修改服务器类型,IIS代表是windows类型
--
保存退出来,重新进行编译编译安装,然后再把之前关闭版本号的“off”改成“on”,打开显示版本号配置,显示出我们设置的版本号来混淆黑客

②修改用户与组

Nginx运行时,进程需要由用户与组的支持,用以对网站文件的读取进行访问控制
主进程由root创建,子进程由用户与组创建
Nginx默认是使用nobody用户账号与组账号,一般也是需要修改的

--
1.之前我们在编译安装Nginx服务中,一般创建运行用户与组是为nginx,以便其更准确地控制其访问权限
2.如果我们在访问nginx的时候全部都是nobody用户,有些缓冲区加载之类的请求可能会因为权限问题而被拒绝,导致前端不能正常查看到访问信息

--
补充一下nobody的意义:
1.nobody在Linux中是一个不能登录的账号,apache、nginx等都会采用一些特殊的账号来运行,可以防止程序本身有安全问题时,不会被黑客获取root权限
2.nobody是一个普通用户,非特权用户,使用nobody用户名的目的是使人和人都可以登录系统,但是其UID和GID不提供任何权限,即只能访问人人皆可读写的文件(权限最小)
3.服务器向外服务,即我们访问服务器时,会以nobody的身份登录
4.nobody就是一个普通账户,默认登录shell为'/sbin/nologin',无法直接登录系统,黑客登录了也很难通过漏洞来破坏服务器
5.这个用户的权限配置很低,某种意义上具有较高安全性,一切都只给最低权限,这就是nobody存在的意义

----
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;

③配置网页缓存时间

1.当Nginx将网页数据返回客户端后,可设置缓存时间
2.方便下次接受相同内容的请求时,能够直接返回
3.能够避免重复请求,加快用户访问速度(用户体验)
4.一般只针对静态资源配置缓存时间,Nginx静态页面处理能力较强

--
补充:
1.网站分为静态页面和动态页面,现在基本没有纯静态页面的网站了
2.现在的网站基本都是使用静态+动态页面,一小部分网站是纯动态
3.负责处理这些页面的服务,简单称之为web服务,负责处理客户端发来的访问请求,如果是静态页面则会讲内容直接呈现给客户端
4.若是动态页面则会将其解析为静态内容后再呈现

--
动态页面:
1.不是独立存在于服务器上的网页文件,当用户请求时服务器才会返回一个完整的网页
2.数据都是存储在数据库中,根据用户发出的不同请求从数据库里提取不同的数据,从而提供个性化的网页内容
3.相对于静态页面而言,访问速度较慢,因为动态页面需要处理成静态内容,才能呈现给用户
4.动态页面的数据是从数据库里提取出来的,如果访问量大的话,会导致数据库的压力很大
6.现在动态网站多数都使用了缓存技术,但相对于静态网站而言,服务器的压力比较大,访问的人越多服务器的压力越大

----
vim /usr/local/nginx/conf/nginx.conf
#加入新的location端,expires参数为指定缓存的时间
location ~ \.(gif|jpg|jepg|png|bmp|ico)$ {
     		#文件结尾格式
            root   html;
            expires 1d;		#1d为1天,以此类推
        }

④日志切割

1.随着Nginx运行时间的增加,日志也会随着增加,别的不提,如果全部写入到一个日志文件中去,文件会变得越来越大,最终导致日志文件的读写速率就会越来越慢!
2.作为运维人员,我们需要经常关注nginx的日志文件,而巨大体量的日志文件对于我们的监控而言,是一个很大的麻烦,非常不利于分析排查
4.因此,我们需要定期的对日志文件进行切割,简单的说,其原理就是定期将以往的日志备份,命名为当时的日期等格式,周而复始
5.Nginx没有类似Apache自带的日志分割处理功能,但是我们可以通过撰写脚本,并且将其加入到周期计划性任务里面,让脚本在每天固定的时间内执行,从而实现日志切割的需求

⑤设置连接超时(会话保持)

1.避免同一个用户长时间的占用连接,导致资源的浪费
2.可设置响应的连接超时参数,实现对连接访问时长的控制
3.HTTP有一个KeepAlive模式,其作用是告诉Web服务器在处理完一个请求后保持这个TCP连接的打开状态
4.若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接
5.KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源,而占用过多就会影响性能
--
vim /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;
keepalive_timeout 65 180;
//'65(s)'指定了与客户端的Keep-Alive连接超时的时间指定每个TCP连接最多可以保持多长时间,服务器会在这个时间后关闭连接
//以上参数若设置为0,则代表着禁止keepalive连接
//'180(s)'指定了在响应头Keep-Alived:timeout=time中的time值,能够让一些浏览器主动关闭连接,若没有这个参数,则Nginx将不会发送Keep-Alived响应头

--
一般只设置该参数即可,不过可以设置以下参数:
client_header_timeout 80;
//指定等待客户端发送请求头的超时时间
//客户端向服务端发送一个完整的'request header'的超时时间
//如果客户端在指定时间内没有发送一个完整的'request header',Nginx返回'HTTP 408'(Request Timed Out)
client_body_timeout 80;
//指定请求体读超时时间
//指定客户端与服务端建立连接后发送'request body'的超时时间
//如果客户端在指定时间内没有发送任何内容,Nginx返回'HTTP 408'(Request Timed Out)

⑥更改进程数

1.尤其是在高并发的环境下,需要启动更多的Nginx进程,以保证能够快速的响应速度来处理用户的请求,以避免阻塞现象,影响用户体验
2.使用'ps aux | grep nginx'查看Nginx运行进程的个数,'master process'为主进程,'worker process'是子进程
--
复习:
1)ps命令,显示包括包含当前运行的各进程完整信息的静态快照,是Linux系统中最为常见的进程查看工具
2)'a'显示当前终端下的所有进程信息,包括其他用户的进程,与“x”选项结合使用时将显示系统中所有的进程信息
3)'u',使用以用户为主的格式输出进程信息
4)'x',显示当前用户在所有终端下的进程信息

--
3.修改Nginx配置文件中的'worker_processes'参数,一般设置为CPU的个数或核数,高并发的情况下可设置为CPU的个数或核数的2倍,可以先查看CPU的核数以确定参数
cat /proc/cpuinfo | grep -c "physical"
--
vim /usr/local/nginx/conf/nginx.conf
worker_processer [*];

--
4.运行进程数多设置一些,这样在响应客户端访问的请求时,Nginx就不会临时启用新的进程来提供服务,技能减少系统的开销,又能提升服务的速度,从而改善了用户体验感

--
修改完参数后,重启服务生效

--
5.在默认情况下,Nginx的多个进程可能更多地跑在一颗CPU上,可以分配不同的进程给不同的CPU处理,以充分的利用多核多CPU,全名提升效率,达到CPU性能最优化
work_cpu_affinity [**** **** **** ****]

⑦配置网页压缩

1.Nginx的'ngx_http_gzip_module'压缩模块提供了对文件内容压缩的功能,允许Nginx服务器将输出内容发送到客户端之前进行压缩
2.能够有效节约网站的带宽,提升用户的访问速度(体验)
3.默认Nginx已经安装该模块,只需在配置文件中加入相应的压缩功能参数即可对压缩性能进行优化
--
gzip on:开启gzip压缩功能
gzip_min_length 1k:用于设置允许压缩的页面最小字数
gzip_buffers 4 16k:表示申请4个单位为16KB的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩效果
gzip_http_version 1.1:用于识别http协议版本,默认是1.1,目前大部分浏览器已支持gzip压缩,但处理很慢,也比较消耗CPU资源
gzip_comp_level 6:用来指定gzip压缩比,压缩比1最小,处理速度最快;压缩比为9最大,传输速度快,但处理速度最慢,使用默认即可
gzip_types text/plain:压缩类型,指对哪些网页文档启用压缩功能
gzip_vary on:选项可以让前端的缓存服务器缓存经过gzip压缩的页面

⑧配置防盗链

1.现在各大网站配备防盗链是最基本的操作了,为了避免网站内容被非法的盗用
2.原理很简单,若是没有配防盗链,那么别的网站就可以挂上你的图片链接,别人在这个网站可以访问你的图片,而且消耗的还是你网站服务器的资源,因为是直接指向你的网站的图片
3.为了避免这种带宽浪费,不被白嫖,我们就需要配置防盗链,很重要!
4.在Nginx中,防盗链的原理就是加入location项,同时运用正则表达式过滤图片类型文件,对于信任网站,则可以正常使用,对于不信任的网站则返回响应的错误图片

⑨FPM 参数优化

1.Nginx的PHP解析功能是由FPM处理的,为了提高PHP的处理速度,就需要对FPM模块进行参数的调整
1)安装带有FPM模块的PHP环境,确保PHP可以正常运行
2)FPM进程有两种启动方式,由pm参数指定,分别是'static''dynamic',前者将产生固定数据的fpm进程,后者将以动态的方式产生fpm进程
3)'static'方式可以使用'pm.max_children'指定启动的进程数量
4)'dynamic'方式的参数则要根据服务器的内存与服务负载进行调整,参数如下表所示
选项 描述
pm.max_children 指定启动的进程的最大的数量
pm.start_servers 动态方式下初始的 ftpm 进程数量
pm.min_spare_servers 动态方式下最小的 fpm 空闲进程数
pm.max_spare_servers 动态方式下最大的 fpm 空闲进程数
假设:
有一台云服务器,运行了个人论坛,内存为 1.5GB,fpm进程数为20,内存消耗近1GB,处理比较慢,需要对参数进行优化处理
--
vim /usr/local/php/etc/php-fpm.conf 
pid = run/php-fpm.pid

--
vim /usr/local/php/etc/php-fpm.d/www.conf
–96行–
pm = dynamic
#以动态方式产生 fpm 进程
–107行–
pm.max_children=20
#启动的进程最大数量为20
–112行–
pm.start_servers = 5
#动态方式下初始的 ftpm 进程数为5
–117行–
pm.min_spare_servers = 2
#动态方式下最小的 fpm 空闲进程数为2
–122行–
pm.max_spare_servers = 8
#动态方式下最大的 fpm 空闲进程数为8

--
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
#平滑重启php-fpm

netstat -anpt | grep 9000
--
FPM启动时有8个进程,最小空闲2个进程,最大空闲8个进程 ,最多可以有20个进程

二、小结

  • Nginx 自身抗高并发的能力本身就不错,尤其是静态页面的处理能力更强

  • 所以说,在互联网高速发展的今天,用户基数越来越大,服务器所承载的压力也越来越大,比如双11?

  • 资本都是用脚来投票的,时代的发展也是,永远是效率第一,需求驱动发展,发展也会反过来提升人们的要求

  • 所以,时代在变迁,现在企业网站应用模式运用更多的是 LNMP,而不是 LAMP 了

  • 你发现了没有,以上全部的调优配置,都可以总结为这一句话,为了安全和抗高并发!

你可能感兴趣的:(每天进步一点点,Nginx,高并发,性能优化,Linux,LNMP)