阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之Nginx配置

摘要:
但是要想使它的并发能力能够施展出来,需要在初步安装好的Nginx上做一些配置。Nginx默认的打开文件的数量可以用cat/proc/`ps-ef|grepnginx|grep-vgrep|head-1|awk'{print$2}'`/limits这个命令查看。这两个值会限制并发数。但是,只是在Nginx的配置文件中添加worker_rlimit_nofile65535;有时候不起作用。sudosystemctldaemon-reload修改到这儿,可以看到Nginx的SoftLimit和HardLimit都发生了变化,而且配置中的worker_rlimit_nofile65535;也开始起了作用。sendfileon;7.告诉Nginx在一个数据包里发送所有头文件,而不一个接一个的发送。tcp_nodelayon;9.由于Nginx对每一个

搭建好LNMP环境之后,接着要考虑的就是整个系统的并发能力了。

一、Nginx的配置

Nginx有很好的并发能力。但是要想使它的并发能力能够施展出来,需要在初步安装好的Nginx上做一些配置。主要需要修改的一些配置有:

1.nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数。

 worker_processes 8;

2.为每个进程分配cpu,将上例中8个进程分配到8个cpu。

 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

3.下面这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是系统的最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

 worker_rlimit_nofile 65535;

这个属性对Nginx的并发影响比较直接,如果值太小,会报错 socket() failed (24: Too many open files) while connecting to upstream 。

Nginx 默认的打开文件的数量可以用 cat /proc/`ps -ef | grep nginx|grep -v grep|head -1|awk '{print $2}'`/limits 这个命令查看。

其中 Max open files,就是一个Nginx进程可以打开的最多文件数,它有两个属性很重要 一个是 Soft Limit(软限制),默认1024;另一个是 Hard Limit(硬限制),默认 4096 。

这两个值会限制并发数。如果用默认值,最大并发只能是 1000 左右。所以如果要进一步提高并发,就要对这两个值做修改。

但是,只是在Nginx的配置文件中添加 worker_rlimit_nofile 65535 ;有时候不起作用。还要对其他两个主要的地方做修改:

3.1.1、修改用户进程可打开文件数限制

在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句

柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:

   ulimit -n

如果命令执行之后显示的数值满足项目需求,可以不做修改,直接看3.2 的步骤;

但是,对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。

3.1.2、修改/etc/security/limits.conf文件,在文件中添加如下行,修改Linux系统对用户的关于打开文件数的软限制和硬限制:

    * soft nofile 65533
    * hard nofile 65533

其中*号表示修改所有用户的限制;如果要修改指定的某个用户,把*换成具体的用户名就可以了,例如 nginx soft nofile 65533,soft或hard指定要修改软限制还是硬限制;65533则指定了想要修改的新的

限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

3.1.3、修改/etc/pam.d/login文件,在文件中添加如下行:

  session required /lib/security/pam_limits.so
    如果是64bit系统的话,应该为 :
  session required /lib64/security/pam_limits.so

这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会

从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。

3.1.4、查看Linux系统级的最大打开文件数限制,使用如下命令:

  cat /proc/sys/fs/file-max

这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)的文件数,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统

硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/sysctl.conf文件,在文件中

添加如下行

  fs.file-max = 70001

3.1.5、执行sysctl命令:

  sysctl -p

修改到这一步,用命令查看,Nginx的 Max open files,可能值还是没有变化。这就需要我们接着修改 nginx.service

3.2.1、查找nginx.service

  rpm -qal |grep nginx.service

3.2.2、修改 nginx.service,在其中添加:

   [Service]
   LimitNOFILE=100000

3.2.3、重启服务。

  sudo systemctl daemon-reload

修改到这儿,可以看到(grep 'open files' /proc/$( cat /var/run/nginx.pid )/limits)Nginx 的 Soft Limit 和 Hard Limit 都发生了变化,而且配置中的 worker_rlimit_nofile 65535; 也开始起了作用。我们接着配置Nginx其他属性:

4.使用epoll的I/O模型,用这个模型来高效处理异步事件

 use epoll;

5.每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

 worker_connections 65535;

6.可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效。

  sendfile on;

7.告诉Nginx在一个数据包里发送所有头文件,而不一个接一个的发送。就是说数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。

  tcp_nopush on;

8.告诉Nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。

  tcp_nodelay on;

9.由于Nginx对每一个请求都会写log,这样会浪费时间,可以把日志注释

   #access_log  /var/log/nginx/access.log  main;
    access_log off;

或者,添加缓存

  access_log  /var/log/nginx/access.log  main buffer=32k;

10.接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间,有时候Nginx的错误日志中会报错 Upstream timed out (110: Connection timed out) while reading response header from upstream ,可以尝试把这个值改大解决。

  fastcgi_read_timeout 300;

下面是一个使用的简单的nginx配置文件:

  user nginx;
  worker_processes 8;
  worker_rlimit_nofile 10240;
  worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  error_log /var/log/nginx/error.log;
  pid /run/nginx.pid;

 # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
  include /usr/share/nginx/modules/*.conf;

  events {
      use epoll;
      worker_connections 10240;
    }

  http {
     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  /var/log/nginx/access.log  main buffer=32k;

     sendfile            on;
     tcp_nopush          on;
     tcp_nodelay         on;
     keepalive_timeout   65;
     types_hash_max_size 2048;

     include             /etc/nginx/mime.types;
     default_type        application/octet-stream;

     fastcgi_connect_timeout 300;
     fastcgi_send_timeout 300;
     fastcgi_read_timeout 300;
     fastcgi_buffer_size 128k;
     fastcgi_buffers 4 128k;
     fastcgi_busy_buffers_size 256k;
     fastcgi_temp_file_write_size 256k;             

     # Load modular configuration files from the /etc/nginx/conf.d directory.
     # See http://nginx.org/en/docs/ngx_core_module.html#include
     # for more information.
     include /etc/nginx/conf.d/*.conf;

     
   server {
    listen       80 default backlog=5000;
    server_name  baidu.com;
    root         /usr/share/nginx/html/baidu;
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    client_max_body_size 1024M;
    client_body_buffer_size 200000k;
    location / {
     index index.php;
     if (!-e $request_filename) {
       rewrite  ^(.*)$  /index.php?s=$1  last;
       break;
          }   

    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

 }

重启 nginx:

  sudo systemctl restart nginx

下一篇随笔主要介绍一下高并发下Nginx和PHP之间的通信以及PHP的配置

本文参考的主要文章:

nginx高并发配置
CentOS下高并发socket最大连接数所受的各种限制
Linux下解决高并发socket最大连接数限制,tcp默认1024个连接
nginx 修改 max open files limits
nginx与php-fpm实现高并发配置

免责声明:文章转载自《阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之Nginx配置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇nginx+thinkPhp配置虚拟主机和伪静态规则重写win7上部署aspx网站下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Nginx 使用 GeoIP 模块区分用户地区

检查 GeoIP 是否安装 首先需要确认当前安装的 Nginx 是否安装了 GeoIP 模块 123456 $ nginx -Vnginx version: nginx/1.12.2built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)built with OpenSSL 1.0.2k-fips 26...

Linux终端的几个常用快捷方式,记下!

一、初识linux的终端种类:本地、远程    查看本终端命令:     #tty 命令,看到当前所处的终端     #(w)who 命令,看到系统中所有登录的用户     其中,tty 终端为表示在本地命令行模式下打开的终端;pts/0,1,2,3 终端为虚拟终端,多为图形界面下打开的终端或者远程登录的终端                     (这个...

linux性能评估-cpu案例操作篇

1.平均负载案例分析 场景一:CPU 密集型进程 场景二:I/O密集型进程 场景三:大量进程的场景 2.CPU 上下文切换案例 2.1怎么查看系统的上下文切换情况 2.2查看每个进程上下文切换的情况 2.3 案例实操 3.CPU使用率的案例 3.1CPU 使用率很高,但为啥却找不到高 CPU 的应用? 3.2 等待 I/O 的 CPU的使用...

《Linux内核精髓:精通Linux内核必会的75个绝技》目录

1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检查补丁的格式HACK #6 使用localmodconfig缩短编译时间 第2章 资源管理HACK #7 Cgroup、Namespace、Linux容器HA...

nginx+tomcat做负载均衡,当某个tomcat宕机,会发生什么情况,如何解决?

使用两台Tomcat,一台nginx做了一个小实验:   步骤一:     当两台tomcat正常运行的情况下,访问http://localhost的速度是很很迅速的,通过修改主页内容也可以观察到是通过负载均衡得到的效果。   步骤二:     实验性的将其中一台tomcat服务器关掉(将8080端口的关闭),再查看http://localhost ,会发...

安全计算环境(三)Linux服务器2

Linux服务器 控制点 2. 访问控制 在系统中实施访问控制的目的是为了保证系统资源(操作系统和数据库管理系统)受控、合法地被使用。用户只能根据自己的权限来访问系统资源,不得越权访问。 a) 安全要求:应对登录的用户分配账户和权限。 要求解读:对于Linux操作系统中的一些重要文件,应检查系统主要目录的权限设置情况,Linux操作系统的文件操作权限,包括...