当前位置 : 主页 > 操作系统 > centos >

nginx配置及调优

来源:互联网 收集:自由互联 发布时间:2022-06-20
我们接上一篇文章:10分钟带你深入浅出Nginx 一、并发和内存。 (一)、关于并发数?         并发的概念以及如何设置并发的值才合适?并发是指我们的网站一瞬时收到的请求数。

我们接上一篇文章:10分钟带你深入浅出Nginx

一、并发和内存。

(一)、关于并发数?

        并发的概念以及如何设置并发的值才合适?并发是指我们的网站一瞬时收到的请求数。假设一个互联网网站平均每日收到了1千万请求,我们可以大致算下。一天这个网站的访问期主要在上午8点到下午10点,也就是说最多只有14个小时的高峰访问。那么我们可以换算下,大致可以算出一秒的并发在2,3百左右。当然这个只是理论值。实际上生成环境中,流量和并发都是不均衡的。比如大部分时段可能并发并不高,但是在一个特殊的时刻。并发有可能翻几十倍。比如团购的秒杀活动开启 的一瞬间和12306在过年买票的时候。

       这里有一个容易误导人的概念,一秒钟就有2,3百的并发,那是不是代表网站一秒钟就有200个人访问?其实不是的,并发200的请求并不是说就有200个人访问,而是指有2百个链接。一个网页一般情况下会有几十到上百个请求不等。举个例子见下图:

nginx配置及调优_nginx配置

在这个网页我们看到这个页面有64个请求。也就说如果这个网站一瞬时的并发量有200的话,那一瞬时的真实访问量可能就是3-4人的点击。这里还涉及到网页调优的概览,明白了并发链接的请求数概念,那是不是同一个网页如果请求越少越好?并不是很极端的越少越好,而是尽量的优化连接数,减少不必要的链接。比如一个优化后页面,可以做到一个页面只使用一个背景图,而没有优化的页面,则可能有10多个甚至更多的背景图。

       为什么要研究并发?仅仅会安装nginx和配置基础环境和能处理大型网站并发这是不同的层面。如果你需要负责中大型网站的设计,需要解决网站缓慢,甚至并发高的时候服务宕机。那如何设计更优化的架构以及nginx调优就是必不可少的环节。

(二)、nginx并发这么高,是不是非常耗内存?

        nginx作为前端,并发这么高,配置nginx的服务器就必须要配置高内存,32G,64G?答案是nginx本身并不耗费内存,一个worker进程只占几十兆。八个woker也才几百兆。所以nginx服务器配置一个什么32G,64G,那就是浪费资源了。以下为16个worker进程所占的内存所示:

root 54173 0.0 0.1 40772 18772 ? Ss Mar20 0:02 nginx: master process /usr/local/nginx/sbin/nginx //master主进程id为54173 [root@web1 ~]# ps --ppid 54173 u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 48757 0.1 0.1 45120 24132 ? D Jul14 15:42 nginx: worker process root 48758 0.2 0.1 45312 23904 ? S Jul14 24:05 nginx: worker process root 48759 0.2 0.1 45184 23808 ? D Jul14 25:44 nginx: worker process root 48760 0.1 0.1 45120 23652 ? D Jul14 16:24 nginx: worker process root 48761 0.2 0.1 45312 23908 ? S Jul14 17:56 nginx: worker process root 48763 0.3 0.1 44992 24072 ? S Jul14 26:57 nginx: worker process root 48764 0.2 0.1 45184 23816 ? D Jul14 19:55 nginx: worker process root 48765 0.3 0.1 45312 24168 ? S Jul14 28:42 nginx: worker process root 48766 0.2 0.1 45120 23904 ? S Jul14 22:05 nginx: worker process root 48767 0.3 0.1 45312 24160 ? S Jul14 27:56 nginx: worker process root 48768 0.2 0.1 45120 23868 ? S Jul14 19:17 nginx: worker process root 48769 0.3 0.1 45312 23904 ? S Jul14 29:11 nginx: worker process root 48770 0.3 0.1 45312 23904 ? S Jul14 29:32 nginx: worker process root 48771 0.3 0.1 45120 23900 ? S Jul14 29:52 nginx: worker process root 48772 0.3 0.1 45120 24164 ? S Jul14 29:51 nginx: worker process root 48773 0.3 0.1 45120 23884 ? S Jul14 29:19 nginx: worker process [root@lwj_web1 ~]# ps --ppid 54173 u |awk 'BEGIN{a=0;}{a+=$6}END{a=a/1024;print a}' 396.168

nginx只占了不到4百兆的内存。

网站请求,真正耗费内存的是后端的服务器。前端nginx作为一个转发和处理静态文件,消耗极少。

 

二、nginx基本配置

(一)、基本配置

配置文件: /usr/local/nginx/conf/nginx.conf          /usr/local为编译安装默认路径,具体的路径已安装路径为主。

user  root;       // 配置nginx用户
worker_processes  8;    //   worker进程数,关于worker进程的介绍在上一篇文章有讲到。worker 进程本身占用内存非常少,一个worker进程大约只占几十兆的内存。

error_log  /var/log/nginx/error.log warn;    //错误日志位置,类型有warn、notice和info,这里建议设置为warn。既然为错误日志,那就至少为警告级别才有记录的意意义,如果设置成info或者notice,就没必要,太多的信息会给查找真正的错误带来不必要的麻烦。

pid        /logs/nginx.pid;   //master进程号 ,这个配置意思是master进程号记录在这个文件

events {
    worker_connections  10240;      //worker工作进程支持的连接数 ,假设我们的woker进程数为8,那我们的nginx就支持并发链接10000*8=80000。这个设置已经完全了。刚才我们已经讲了关于并发数的知识,200的并发数,一天都能达到千万级别的请求。这个配置大概上限设置多少,应该根据压力测试来衡量,机器最多的承载量。不然设置的再高,你机器本身也承受不住,也没意义。
}

//http模块配置

http {
    include       mime.types;    //请求文件类型配置,用来设置http请求对应的文件返回类型

   //默认无法识别的文件类型为下载。比如访问一个文件aaa.lwj,这个文件类型是mime.types里面没有配置的。浏览器对nginx进行请求访问这个aaa.lwj文件的时候,会按照application/octet-stream方式进行处理。就是可以直接下载。
   default_type  application/octet-stream;     

   server_names_hash_bucket_size 128;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '      //设置日志展示格式。详细说明见第三部分
                                 '$status $body_bytes_sent "$http_referer" '
                                 '"$http_user_agent" "$http_x_forwarded_for"';

 

    #access_log  logs/access.log  main;

    sendfile        on;      //开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件普通网站应用设置为on,如果是专用下载服务器设置为off

    tcp_nopush     on;   //防止网络阻塞 ,必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量

    autoindex  off //开启目录列表访问。默认关闭,如果是专用下载服务器设置为on。如果是普通网站应用,一定要设置off。

    keepalive_timeout  65;  //回话保持。保持65秒tcp三次握手。超过65秒未活动,就重新申请tcp三次握手

   gzip on;   //开启文件压缩

   access_log  logs/access.log;


    include /usr/local/nginx/conf/conf.d/*.conf;  //虚拟主机配置

    //server 配置

     server {
        listen       80;  //监听端口
        ssi on;      //是否开启ssi
        ssi_silent_errors off;
        ssi_types text/shtml;      
        server_name  abc.com;  //网站域名
        root         /xxx/abc;    //网站根目录 
        index  index.html;      //默认首页文件
        location / {
       }

      }

}

 (二)、反向代理配置

server { listen 80; server_name test.com; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-NginX-Proxy true; proxy_pass 192.168.0.61; } }

(三)、负责均衡配置

#定义集群 upstream demo{ server localhost: 192.168.0.61; server localhost: 192.168.0.62; } listen 8080; server_name localhost; location / { proxy_pass http://demo; }

 

三、nginx调优

(一)、开启gzip压缩

       什么是gzip压缩?gzip压缩就是访问网页的时候,nginx会利用cpu资源把指定类型的文件通过文件压缩方式,把源文件压缩后发给客户端浏览器,再由客户端浏览器进行解压。

       为什么要开启压缩文件?因为开启后,可以大量节约带宽以及网站页面打开速度。举个列子:一个网页有10个js文件,平均每个js文件100k,那么加载这个页面的js文件就需要1000k,开启压缩后,至少会节约一半的大小,这个还只是js文件,如果算上css文件压缩的大小,整个网页所需资源会减少不少。千万别小看减少的这点大小所需要的流量及时间,如果是千万级别的请求,可以想象,会提高不少网站相应的速度。当然这个优化是针对大中型网站而言,如果网站每天就几十个ip访问,那这个设置确实没任何价值。

gzip on; gzip_min_length 4k; #小于4k的文件不压缩 gzip_buffers 4 128k; #缓存区大小,最小4k,最大128k,如果不够,会自动以4的倍数增加 gzip_http version 1.1; #压缩http 1.1版本的文件,具体多少以实际使用的http协议版本为准 gzip_comp__level 6; #压缩级别,压缩占用的是cpu资源。最大为9,具体设置多少,可以根据cpu使用率来考虑,如果cpu长期使用率非常低。可以适当设置高一点 gzip_types text/plain application/javascript text/css application/xml #压缩的文件类型,txt js css xml gzip_vary on; #如果前端使用了代理,也可以压缩

注意这里不建议压缩图片,一般压缩js、css、txt、xml等比较固定的文件。

(二)、优化nginx对CPU亲和力

        默认情况下可能多个进程跑在一个CPU上或某一核上,导致Nginx进程使用硬件资源不均匀,这个优化是尽可能地分配不同的Nginx进程给不同的CPU处理。

worker_processes auto; # 这个参数设置为auto,nginx会自动根据cpu核心数来一一生成对应的worker进程,充分利用多核cpu性能优势。

(三)、配置Nginx worker进程最大打开文件数

worker_rlimit_nofile 65535; #一个ningx进程打开的最多文件描述符数量,理论值是应该和最大打开文件数(ulimit -n)与nginx进程数相乘,但是nginx分配请求并不是那么平均。所以最好设置为和ulimit -n 的值保持一致(默认ulimit为1024,建议设置为65535)。

(四)、全局错误日志及PID文件

error_log /usr/local/nginx/logs/error.log info;

#错误日志定义等级:[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少。

crit信息最少,debug 信息最多。默认为crit,生产场景一般是 warn | error | crit 这三个级别之一。

(五)、工作模式级链接数上限

events { use epoll; # 使用epll模型,可以提供并发能力,默认是使用epll worker_connections 10240; #一个worker进程的连接数上限。 multi accept on; #尽可能接收更多的请求 }

(六)、expires缓存调优

        缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来!

       这里需要注意,如果是网站经常性变更图片及css、js文件的话,这个功能就不太合适。

xpires缓存配置在server字段里面

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /usr/local/nginx/html/ expires 3650d; } location ~* \.(ico|txt|css|js)$ { { root /usr/local/nginx/html/ expires 30d; }

同时也可以对目录及其进行判断:

location ~ ^/(images|javascript|js|css|flash|media|static)/ { root /usr/local/nginx/html/ expires 360d; } location ~(robots.txt) { root /usr/local/nginx/html/ expires 7d; break; }

   expire功能优点
(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。
  expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
网站不希望被缓存的内容
1)广告图片
2)网站流量统计工具
3)更新频繁的文件(logo)

(七)、日志切割优化

1、分割

日志分割的目的,是为了一天日志一压缩,按天存放,方便查找

vim cut_nginx_log.sh        //每天日志分割脚本

#!/bin/bash date=$(date +%F -d -1day) cd /usr/local/nginx/logs if [ ! -d cut ] ; then mkdir cut fi mv access.log cut/access_$(date +%F -d -1day).log mv error.log cut/error_$(date +%F -d -1day).log /usr/local/nginx/sbin/nginx -s reload tar -jcvf cut/$date.tar.bz2 cut/* rm -rf cut/access* && rm -rf cut/error* cat >>/var/spool/cron/root<<eof 00 00 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1 eof find -type f -mtime +10 | xargs rm -rf

        健康检查的日志,不用输入到log中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如200,301,404的状态吗,在SEO中很重要,而且我们统计PV是页面计算,这些都没有意义,反而消耗了磁盘IO,降低了服务器性能,我们可以屏蔽这些如图片,js,css这些不宜变化的内容。

vim /usr/local/nginx/conf/nginx.conf

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

2、日志格式优化

根据需要配置日志格式,以下是常用字段含义:

$remote_addr    客户端ip

$server_name  虚拟主机名称

$http_x_forwarded_for  http的请求端真实的ip

$remote_user  记录客户端用户名称

$request  记录请求的url和http协议

$status  记录返回http请求的状态

$uptream status   uptream的状态

$ssl_protocol   SSL协议版本

$body_bytes_sent   发送跟客户端的字节数,不包括响应头的大小

$bytes_sent 发送跟客户端的总字节数

$connection_requests   当前通过一个链接获得的请求数量

$http_referer      记录从那个页面链接访问过来的

$http_user_agent   记录客户端浏览器相关信息

(八)、IP和301优化

现在工信部根据最新等保要求,访问网站的时候,不能直接使用IP访问,我们可以把这一层给屏蔽掉,让其直接反馈给403,也可以做跳转

跳转的做法:

server { listen 80 default_server; server_name localhost; rewrite ^ http://www.baidu.com$request_uri?; }

403反馈的做法:

server { listen 80 default_server; server_name localhost; return 403; }

 

  (九)、防止DDOS

通过使用limit_conn_zone进行控制单个IP或者域名的访问次数

vim /usr/local/nginx/conf/nginx.conf

http字段中配置

limit_conn_zone $binary_remote_addr zone=addr:10m;

server的location字段配置

location / { root html; limit_conn addr 1; }

配置完后,可以进行压力测试: ab -c 2 -t 1 http://192.168.0.61/lwj/index.html

 

(十)、其他设置

client_max_body_size 10m; # 允许客户端post请求的最大单文件字节数, client_body_buffer_size 128k; # 服务器缓冲用户端请求的最大字节数; proxy_connect_timeout 300; # nginx跟后端服务器链接超时时间(代理链接超时) proxy_send_timeout 300; #链接成功后,后端服务器数据回传时间(代理发送超时) proxy_read_timeout 300; #链接成功后,后端服务器相应时间(代理接收时间)

proxy这3个参数单位都是秒。如果调整小了就会出现504错误。如果太大也会影响nginx的性能。所以根据后端访问程序的类型来,灵活配置。一般情况下。300足够。如果后端程序是会话登录类型,可以适当增加到900就足够了。900秒是10多分钟了。所以如果后端10多分钟都还不能响应。那肯定是有故障的。所以再增加时间也是徒劳,反而增加nginx等待的时间。

proxy_buffer_size 4k; #设置代理服务器nginx保存用户头信息的缓冲区大小 proxy_buffer 4 32k; #缓冲区,网页平均在32k以下的这样设置。 proxy_busy_buffers_site 64k; #高负载下缓冲大小 (proxy_buffer的2倍)

 

large_client_header_buffer 4 16k; #客户端最大请求

client_header_buffer_size 4k; #客户端请求头部的缓冲区大小,可以根据系统分页大小来设置,一般头部大小不会超过1k;不过由于分页大小一般都是大于1k。所以i根据分页大小来设置

[root@localhost ~]# getconf PAGESIZE 4096

client_body_buffer_size  1024 #处理客户端请求体buffer大小。用来处理POST提交数据,上传文件等。client_body_buffer_size 需要足够大以容纳如果需要上传POST数据。

 

四、常见http错误代码

       网站经常会遇到一些错误代码,根据错误返回的代码,能基本判断问题的所在

1、400 Bad Request

400状态代码,也称为错误请求 错误,表示发送到主机的HTTP请求的语法无效。

2、401 Unauthorized

401状态码,也称为未授权错误,这意味着尝试访问资源的用户尚未通过身份验证或未正确通过身份验证。用户必须提供有效的凭据才能查看受保护的内容和资源。

当用户尝试访问受HTTP身份验证保护的资源时,可能会发生该错误。在这种情况下,用户将收到401响应码,直到他们提供有效的用户名和密码为止。

3、403 Forbidden 

该状态表示用户发出了有效请求,但主机拒绝为访问或请求提供服务。这可能是由于缺少对所请求资源的访问权限所致。常见原因包括文件权限、htaccess 文件的使用、索引文件不存在等等。

4、404 Not Found

表示用户可以与主机通信,但主机找不到所需的文件或资源。

5、500 Internal Server Error

这表示主机由于未知原因无法处理该请求,最常见原因是服务器配置错误。

6、502 Bad Gateway

表示网关或代理服务器未从后端主机收到有效的响应,而该响应实际上应回答该请求。

7、503 Service Unavailable

表示主机过载或正在维护。这通常意味着该服务将在某个时候再次可用,例如在维护网站之后。

8、504 Gateway Timeout

仅表示网关或代理主机未在允许的时间段内接收到来自后端主机的响应。

网友评论