目次
1. はじめに
1. Mysql 設定パラメータ:
2. 注
2. PHP パラメータの設定と説明
1. phpini の基本設定
2. PHP パラメータの設定
3、php-fpm中的慢日志设置
(1)慢日志的主要参数
(2)利用sort/uniq命令分析汇总php-fpm慢日志:
4、php-fpm中的backlog是干啥的?
四、nginx配置参数调优
1、nginx中的一些层级关系
2、nginx.conf 实例及解释
3、对于conf.d文件夹中的配置
4、保存编辑之后检查配置文件的正确性
(1)检查配置文件是否正确
(2)检查子级配置文件是否正确
五、影响程序超时的参数
1、关于php和php-fpm超时时间的设置
2、nginx中的超时设置
3、nginx中的keepalive_timeout
ホームページ 運用・保守 Nginx php+php-fom+nginx設定パラメータを最適化する方法

php+php-fom+nginx設定パラメータを最適化する方法

Jun 03, 2023 pm 08:04 PM
php nginx

php+php-fom+nginx設定パラメータを最適化する方法

1. はじめに

新しいサーバーの場合、LNMP 環境のインストールは最初のステップにすぎません。もちろん 2 番目のステップは変更です。これらのプログラムを使いやすくし、パフォーマンスを向上させるためにデフォルトのパラメータを設定します。この記事では主に php php-fpm nginx の構成パラメータについて説明します。マシンは 4GB メモリを備えたサーバーです。関連する構成は、4GB を備えたサーバーに従って構成されています 記憶の。

1. Mysql 設定パラメータ:

Mysql 設定パラメータのチューニング (8GB メモリと 64GB メモリ)
Mysql 設定ファイルの構成と具体的な設定デモ

2. 注

以下にリストされている構成項目は、パフォーマンスに影響を与えるか、構成する必要があります。リストされていない構成項目はデフォルト設定です。これら 3 つのプログラムには多くの設定パラメータがあります。私たちのサーバーは最初からあまり複雑な設定を使用できません。次の設定は主に高い同時実行性を最大化し、プログラムのパフォーマンスを向上させるためのものです。

php と php-fpm はどちらもバージョン 5.6 です。 (すべては古いプロジェクトとの互換性のため、大変です)

2. PHP パラメータの設定と説明

1. phpini の基本設定

(1)safe_mode  这份的配置采用默认的
(2)disable_functions  在默认的基础上,加上eval()函数
(3)expose_php = off
(4)register_globals和magic_quotes_gpc参数都在php5.4.0后被移除了
(5)错误提示以及日志部分采用默认的就行,现在大部分使用的都是框架,
查看框架的错误日志更方便
ログイン後にコピー

これらのいくつかパラメータはインターネット上でよく言及されていますが、ここではその設定に従う必要はありません。結局のところ、長い時間が経ち、多くの bug やパフォーマンスの問題が修正されています。

2. PHP パラメータの設定

(1) max_execution_time = 300

スクリプトの実行にかかる最大時間です。指定時間を超えた場合は、 、スクリプトは自動的に kill します。このリクエストでは、大きなファイルをアップロードできるようにするために、この値は大きく設定されています。この値が小さすぎる場合も、プログラム 502 エラーが発生します。

(2)memory_limit = 128M

各スクリプトで使用される最大メモリ

(3)max_inpit_time = 300

各スクリプトが入力データを待機する最大時間

#(4) Upload_max_filesize = 20M

アップロードされるファイルの最大許容サイズ

(5)allow_url_fopen = off

リモート アドレスを開かないでください

(6)post_max_size = 20M
postアップロードのサイズは >=upload_max_filesize

(7);cgi.fix_pathinfo=1 である必要があります。これはデフォルトでオンになっています。現在、上位バージョン
php はこの脆弱性を回避しています。php-fpmsecurity.limit_extensions のデフォルト値は、長い間 .php でした。 。したがって、このパラメータにはデフォルト値をそのまま使用できます。 参考:php fpm設定項目 cgi.fix_pathinfo=1 脆弱性は発生しなくなりました

php.iniについて、主に実行時間の向上を目的として設定するパラメータですプログラムの変更、アップロード ファイル サイズの増加などにより、通常の php 開発が容易になります。

3. php-fpm 設定

1. 子プロセスの数を設定し、同時実行量を増やす

log_level = notice		//notice级别的日志,默认的
rlimit_files = 4048		//调整最大打开文件数量
pm选用动态变化的dynamic

process.max = 150		// 最大子进程,设置成和max_children一样就行
pm = dynamic
pm.max_children = 150	//最大子进程,假如一个进程30M,4G内存的话最大为:4048/30 = 135,取150
pm.start_servers = 20
pm.min_spare_servers = 6
pm.max_spare_serveres = 30   
//计算公式是:min_spare_servers ≤ start_servers ≤ max_spare_servers ≤ max_children
ログイン後にコピー

多くの人が、メモリが比較的大きい場合は、次に、静的

pm = static を設定します。この時点では、max_children パラメーターのみが機能します。最初は、max_children プロセスがあり、 は 1 つだけあります。 php-fpm プロセスは、約 3M のメモリのみを占有します。4GB マシンは、20M および max_children# のプロセスとして計算されます。 ## が設定可能で、200 または 150 です。専用の php サーバーの場合、最高のパフォーマンスを得るために静的に設定することをお勧めします。 動的に設定すれば可能です。この場合、

start_servers

などのプログラムが動作し、業務の増加に応じて新しいプロセスが追加され続けますが、最大プロセスの数は max_children を超えることはできません。ブロガーは、マシンのメモリが少なく、mysqlredis なども実行していると考え、動的マシンを選択しました。訪問数が増えると、静的に変更される可能性があります。 2. 多発する 502 エラーを防ぐ

(1) process_control_timeout = 20

php-fpm

子プロセスに割り当て

の時間間隔 (2) request_terminate_timeout = 320s

は、終了していない

php# を終了する前に

320 秒待機することを意味します##占有されているリソースを解放するためのスクリプト。 320s を設定するのは、主に php のプログラム実行時間が 300s であるためです。そのため、php-fpm の場合、この値は より大きくなければなりません。 phpスクリプトによって指定された実行時間 (php スクリプトの実行には mysql サービスまたはその他のサービスも含まれる可能性があるため、このパラメータは強制終了します)このプロセスには、純粋な php スクリプトやその他のサービスが含まれます)。 (3) 自動再起動設定

#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果
#超过emergency_restart_threshold个php-fpm就会优雅重启。这两个选项一般保持默认值

emergency_restart_threshold = 30
emergency_restart_interval = 60s	//一分钟内出现30次上述信号即重启php-fpm
ログイン後にコピー
(4)pm.max_requests = 1000

各子プロセス要求されたサービスの最大数。この値を超えると、子プロセスが自動的に再起動されます。

比如max_requests这个参数,如果设置很大的话,那这个子进程要运行很多次才会重启,假如这个请求发生了错误或者内存泄漏,那么这个值设置很大是不合适的。但如果请求没有问题,这个值设置小的话就会频繁的重启,这样也会碰到不少502的问题,所以要仁者见仁,智者见智的设置了,这里初始化设置1000,如果测试没有内存泄漏等问题,可以再大一些。

3、php-fpm中的慢日志设置

mysql中有慢日志这个概念,可以记录查询速度比较慢的sql,同样的,php-fpm也可以开启慢日志,记录执行速度比较慢的php请求,方便我们后续的调试和优化。

(1)慢日志的主要参数

request_slowlog_timeout : 默认是注释的,打开注释,设置为1,代表请求超过1s,就会记录这个脚本到慢日志文件中。也可以的更大,按照需求来。
slowlog : 默认也是注释的,可以打开注释使用默认的慢日志路径,也可以自定义路径。

这里开启慢日志,如下:

request_slowlog_timeout = 2   # 记录超过2s的请求
slowlog = /var/log/php-fpm/www-slow.log	#慢日志路径
ログイン後にコピー
(2)利用sort/uniq命令分析汇总php-fpm慢日志:
grep -v “^$” www.log.slow.tmp | cut -d ” ” -f 3,2 | sort | uniq -c | sort -k1,1nr | head -n 50
ログイン後にコピー

参数解释:

sort: 对单词进行排序
uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数
sort -k1,1nr: 按照第一个字段,数值排序,且为逆序
head -10: 取前10行数据
ログイン後にコピー

4、php-fpm中的backlog是干啥的?

如果worker进程不够用,master进程会prefork更多进程,如果prefork达到了pm.max_children上限,worker进程又全都繁忙,这时master进程会把请求挂起到连接队列backlog里,而backlog默认值是511,除了加大pm.max_children,调整backlog也是有必要的。

也就说这个backlog是在优化高并发的时候必须要设置的,这个值的大小和fpmqps也有关。backlog太大,fpm处理不过来照样会报错504(超时)。这个对于目前的机器来说,我设置的max_children = 150,然而backlog的默认值是511,所以在短期内是完全够用的,不过也可以在php-fpm.conf里面显式的制定backlog的值,比如制定:listen.backlog = 1024 #2的n次幂

参考:

PHP参数调优
nginx报错502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)
php-fpm进程数管理
关于PHP-FPM的backlog的默认值
PHP-FPM中backlog参数变更的一些思考
PHP-fpm

四、nginx配置参数调优

1、nginx中的一些层级关系

一般打开nginx配置文件,会发现有httpserver,location等,那么他们的层级关系是什么样的呢?

答案是: 一个http里面可以有多个server,一个server里面可以有多个location

我们配置的时候,各个server共用的部分可以配置在http模块里面。每个server自己特有的一些部分,按照各自的需求配置在server模块里面。同样的,对于location是分的更细的,按照每个server的每个location需求来配置。

其次是如果在conf.d文件夹下有其他的配置文件,那么我们的nginx.conf就是公用的配置文件了,一些公用的部分都可以配置在nginx.conf文件中,各个站点特殊的配置就放在conf.d文件下。

参考:
nginx短篇(4):模块、配置指令、块之间的关系

2、nginx.conf 实例及解释

user www-data;
worker_processes auto; #自动检测CPU的核数
worker_rlimit_nofile 65535;  #worker进程的最大打开文件数限制
error_log   /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
pid /run/nginx.pid;

events {
    worker_connections  10240;  #子进程最大连接数,总连接数:worker_processes * worker_connections
    use epoll; #使用epoll模型
}

http {
    include       mime.types; # #文件扩展名与文件类型映射表
    default_type  application/octet-stream;  #这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件

        #记录都有哪些变量可以记录到log_format
        log_format  main  '$remote_addr $host $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_accept_language" "$request_time" '
                      '"$upstream_response_time" "$upstream_addr" "$upstream_status" "$http_x_real_ip" "$proxy_add_x_forwarded_for"';

    sendfile        on;  #立即将数据从磁盘读到OS缓存
    tcp_nopush      on;  #告诉nginx在一个数据包里发送所有头文件
    tcp_nodelay     on;  # 告诉nginx不要缓存数据,而是一段一段的发送
    keepalive_timeout  30; #服务器将在这个超时时间过后关闭链接
    types_hash_max_size 2014;

    #resolver xxx;  #用于解析上游服务器名称的名称服务器配置到地址中
    gzip_static on;
    gzip  on;
    gzip_http_version 1.1;
    gzip_vary off;
    gzip_comp_level 4;  #数据的压缩等级,9是最慢但是压缩比最大的
    gzip_proxied off;
    gzip_buffers 16 8k;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    #设置需要压缩的数据格式
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/hero-res;

    client_max_body_size 20m;  #设置网页上传文件的最大值,和php.ini中的上传设置保持一致
    server_names_hash_max_size 2048;  #保存服务器名字的hash表

    include /etc/nginx/client.conf;
    include /etc/nginx/conf.d/*.conf;
}
ログイン後にコピー

(1)worker_rlimit_nofile

更改worker进程的最大打开文件数限制。

查看当前进程可以打开的文件数:

ulimit-n			
//结果:65535
ログイン後にコピー

查看当前系统可以打开的最大文件数:

ljf@hx:cat /proc/sys/fs/file-max
813544
ログイン後にコピー

(2)log_format中的内容

参考官网:https://nginx.org/en/docs/http/ngx_http_core_module.html#var_status

remote_addr:对应客户端的地址
remote_user:是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
time_local:表示nginx服务器时间
request:表示request请求头的行
status:表示response的返回状态
body_bytes_sent:表示从服务端返回给客户端的body数据大小
http_referer:表示请求的上一级页面
http_user_agent:表示agent信息
http_x_forwarded_for:会记录每一级请求中信息
ログイン後にコピー

(3)gzip压缩相关解释

参考:https://www.jb51.net/article/95041.htm

(4)client_max_body_size设置

这个参数规定客户端上传的body的最大值,和php.ini中的最大上传数保持一致,不然的话,就算php.ini设置上传的最大文件是1G,如果nginx
不设置这个参数的话,那么上传一样会报错的。

3、对于conf.d文件夹中的配置

(1)配置实例代码

server{
      listen IP:80;
    server_name xxx;
    access_log  /var/log/nginx/access.log;  #access日志

    fastcgi_intercept_errors on; #支持nginx404重定向

    index index.php index.html  index.htm;

    root /product/ucool/production/manage/htdocs/backend/web/;

        send_timeout 15;
        #客户端与服务器建立连接后发送request body的超时时间(小于keepalive_timeout)
        client_body_timeout 20;
        #客户端向服务器发送一个完整的request header的超时时间(小于keepalive_timeout)
        client_header_timeout 20;
        fastcgi_connect_timeout         300;    #指定连接到后端FastCGI的超时时间
        fastcgi_send_timeout            300;    #指定向FastCGI传送请求的超时时间
        fastcgi_read_timeout            300;    #指定接收FastCGI应答的超时时间
        fastcgi_buffer_size 64k;               #指定读取FastCGI应答第一部分需要用多大的缓冲区
        fastcgi_buffers 4 64k;                 #定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求


      location ~* ^.+\.(git|svn|sql|bak|old|rar|tgz|7z|bz2|tar|idea)$ {
        return 404;
      }
      location ~ \.php$ {
                fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
                include fastcgi_params;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
        location ~ /\.git { deny all; }
}
ログイン後にコピー

(2)主要是fastcgi的一些配置

这里不考虑负载均衡和反向代理,关于fastcgi的优化可以参考:

https://www.jb51.net/article/145222.htm

(3)关于send_timeout

    send_timeout 15;
    #客户端与服务器建立连接后发送request body的超时时间(小于keepalive_timeout)
    client_body_timeout 20;
    #客户端向服务器发送一个完整的request header的超时时间(小于keepalive_timeout)
    client_header_timeout 20;
ログイン後にコピー

这几个参数最好是再小一些,包括keepalive_timeout,小一些的话,能处理更多的有效请求,有利于提升nginx的处理性能,大佬们的设置如下:

client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
ログイン後にコピー

4、保存编辑之后检查配置文件的正确性

(1)检查配置文件是否正确
ljf@hx:/etc/nginx$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ログイン後にコピー

返回successful并且没有报错信息的话,说明配置文件里面的语法是没问题的,如果报错了那就是语法出错了,导致配置无法正常读取。

(2)检查子级配置文件是否正确
nginx -t -c /etc/nginx/conf.d/xxx.conf
ログイン後にコピー

例如:

ljf@hx:/etc/nginx$ sudo nginx -t -c /etc/nginx/conf.d/api.conf
nginx: [emerg] "server" directive is not allowed here in /etc/nginx/conf.d/api.conf:1
nginx: configuration file /etc/nginx/conf.d/api.conf test failed
ログイン後にコピー

很明显配置文件是错的。

五、影响程序超时的参数

php.ini中有max_execution_time 参数。
php-fpm中有request_terminate_timeout参数
nginx.conf中有 fastcgi_connect_timeout 等参数。
ログイン後にコピー

1、关于php和php-fpm超时时间的设置

首先是max_execution_time 这个值限定了脚本的最大执行时间,但是仅限于php脚本,对于脚本中的流操作和数据库操作等耗费的时间是不算进去的。而php-fpmrequest_terminate_timeout 代表单个请求的超时中止时间,并不会受其他脚本影响,定义10s结束,那么10s就准时结束该php脚本的运行。所以配置超时时间的时候,request_terminate_timeout 可以比max_execution_time  稍微大一些。

还有一种说法,在服务器正常运行的时候,php-fpm.conf中的request_terminate_timeout 会覆盖php.ini中的max_execution_time,所以request_terminate_timeout 的值更代表我们对于脚本执行时间的预期。如果服务器性能足够好,可以设置request_terminate_timeout = 0代表永不超时。

当程序运行时间大于规定的参数的时候,php-fpm会终止该php子进程。

2、nginx中的超时设置

nginxfastcgi_connect_timeout 操作影响的是ningx的超时,一般来说,如果是php或者php-fpm超时,那么报错502 Bad Gateway(网关错误)  。如果是nginx超时的话,报错是:504 Gateway Time-out (网关超时) ,到时候我们可以根据这个报错信息来定位问题。一般来说,为防止频繁的出现超时错误,设置fastcgi_connect_timeout 相关时间为300s是合适的。

假如设置fastcgi_read_timeout=10test.php执行时间100秒,则10秒后webserver会关闭和PHP的连接。也就是说当程序运行时间大于规定的参数的时候,webserver会关闭和PHP的连接,出现超时错误。所以这个fastcgi的超时时间最好是和php-fpm中的request_terminate_timeout 保持一致。

3、nginx中的keepalive_timeout

keepalive_timeout参数是一个请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于线程池,数据库连接池。

以上がphp+php-fom+nginx設定パラメータを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

See all articles