Rumah >pembangunan bahagian belakang >tutorial php >Ketahui lebih lanjut tentang cara mengoptimumkan parameter konfigurasi nginx php php-fom

Ketahui lebih lanjut tentang cara mengoptimumkan parameter konfigurasi nginx php php-fom

青灯夜游
青灯夜游ke hadapan
2022-03-04 15:57:416368semak imbas

Bagaimana untuk mengoptimumkan parameter konfigurasi nginx php php-fom? Artikel berikut akan memberi anda pengenalan terperinci kepada kaedah penalaan parameter konfigurasi php php-fom nginx Saya harap ia akan membantu anda.

Ketahui lebih lanjut tentang cara mengoptimumkan parameter konfigurasi nginx php php-fom

1. Pengenalan

Untuk pelayan baharu, memasang persekitaran LNMP hanyalah langkah pertama. Langkah kedua sudah tentu untuk mengubah suai Konfigurasi lalai menjadikan program ini lebih mudah digunakan dan meningkatkan prestasi. Artikel ini terutamanya bercakap tentang parameter konfigurasi php php-fpm nginx Mesin ialah pelayan dengan memori 4GB dan konfigurasi yang berkaitan dikonfigurasikan mengikut pelayan dengan memori 4GB.

1. Parameter konfigurasi mysql:

penalaan parameter konfigurasi mysql (memori 8GB dan memori 64GB)
komposisi fail konfigurasi mysql dan demo konfigurasi khusus

2. Nota

Beberapa konfigurasi yang diberikan di bawah berkemungkinan besar mempengaruhi prestasi atau mesti dikonfigurasikan semuanya secara lalai. Terdapat banyak parameter konfigurasi untuk ketiga-tiga program ini Pelayan kami tidak boleh menggunakan konfigurasi yang terlalu rumit pada permulaannya.

php dan php-fpm kedua-duanya adalah versi 5.6. (Semuanya adalah untuk keserasian dengan projek lama, kerja keras)

2 konfigurasi dan penjelasan parameter PHP

1 🎜> Parameter ini sering disebut dalam talian, tetapi kami tidak semestinya mengikut konfigurasinya di sini Lagipun, sudah lama dan banyak

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

bug2. Tetapan parameter PHP

(1) max_execution_time = 300

Masa maksimum skrip boleh dijalankan melebihi masa peraturan, skrip akan mematikan permintaan ini secara automatik Untuk memuat naik fail besar, nilai ini ditetapkan lebih besar. Jika nilai ini terlalu kecil, ia juga akan menyebabkan ralat program 502.

(2) memory_limit = 128M

Memori maksimum yang digunakan oleh setiap skrip

(3) max_inpit_time = 300

Masa maksimum untuk setiap skrip menunggu data input

(4) upload_max_filesize = 20M

Saiz maksimum yang dibenarkan bagi fail yang dimuat naik

(5)allow_url_fopen = off

Larang membuka alamat jauh

(6) post_max_size = 20M

Muat naik saiz , menjadi
post>=upload_max_filesize (7);cgi.fix_pathinfo=1

harus dihidupkan secara lalai Versi yang lebih tinggi semasa telah mengelakkan kerentanan ini , 's
Nilai lalai telah lama menjadi php. Jadi kita hanya boleh menggunakan nilai lalai untuk parameter ini. php-fpmRujukan: item tetapan php fpm cgi.fix_pathinfo=1 Kerentanan tidak lagi muncul security.limit_extensions.php Mengenai
, ini adalah parameter yang perlu ditetapkan, terutamanya untuk meningkatkan masa berjalan program, meningkatkan saiz fail yang dimuat naik, dsb. , yang boleh memudahkan pembangunan

biasa kami.

php.ini3. Tetapan php-fpmphp

1. Tetapkan bilangan proses anak dan tingkatkan jumlah penyelarasan

Ramai orang mempunyai mencadangkan ini, Jika ingatan anda agak besar, kemudian tetapkan

statik pada masa ini, hanya parameter
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
akan ada proses

pada mulanya hanya menduduki pm = static Memori kiri dan kanan dikira mengikut proses max_children pada mesin max_children kami Anda boleh menetapkan php-fpm kepada 3M atau 4GB. Jika ia adalah pelayan 20M khusus, adalah disyorkan untuk menetapkannya kepada statik untuk prestasi terbaik. max_children200 Ia juga boleh ditetapkan kepada dinamik Dalam kes ini, program seperti 150 akan berfungsi dan proses baharu akan terus ditambah apabila perniagaan meningkat Walau bagaimanapun, bilangan maksimum proses tidak boleh melebihi php. Blogger menganggap bahawa mesin mempunyai memori kecil dan juga menjalankan

,

, dan lain-lain pada mesin, jadi dia memilih yang dinamik, supaya tidak akan ada banyak tekanan pada mulanya daripada peningkatan lawatan, ia boleh diubah suai. start_serversmax_childrenmysql2. Cegah ralat 502 yang kerap redis

(1) process_control_timeout = 20

Alokasikan kepada proses anak selang masa

(2) request_terminate_timeout = 320sphp-fpm

      表示等待320秒后,结束那些没有自动结束的php脚本,以释放占用的资源。设置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是合适的。

Jika anda menetapkan fastcgi_read_timeout=10 dan test.php masa pelaksanaan ialah 100 saat, maka 10 akan menutup sambungan dengan webserver selepas PHP saat. Maksudnya, apabila masa berjalan program lebih besar daripada parameter yang ditentukan, webserver akan menutup sambungan dengan PHP dan ralat tamat masa akan berlaku. Oleh itu, tempoh tamat masa fastcgi ini hendaklah konsisten dengan php-fpm dalam request_terminate_timeout.

3. keepalive_timeout dalam nginx

Parameter keepalive_timeout ialah berapa lama untuk mengekalkan sambungan selepas permintaan selesai, bukan berapa lama permintaan itu adalah untuk mengekalkan sambungan yang panjang.

4. Ringkasan

Untuk tamat masa program, hanya menetapkan php atau tetapan php-fpm tidak dapat menyelesaikan masalah ini sepenuhnya. Kerana ia berfungsi dalam penyelarasan, anda mesti mempertimbangkan satu sama lain apabila menetapkan parameter ini untuk mengelakkan papan terendah daripada menjejaskan prestasi sistem disebabkan oleh prinsip tong.

Di atas ialah penalaan parameter untuk php php-fpm nginx Konfigurasi ini telah ditetapkan secara setempat dan tiada masalah nilai yang diubah suai adalah untuk memaksimumkan prestasi pelayan kami. Kesan sebenar perlu diuji dalam persekitaran pengeluaran, tetapi ia pasti lebih baik daripada konfigurasi lalai.

Saya akan terus mengemas kini parameter ini berdasarkan maklum balas daripada persekitaran pengeluaran pada masa hadapan Jika anda mempunyai pendapat yang baik atau pendapat yang berbeza, dialu-alukan untuk berkomunikasi~

<.>tamat

Pembelajaran yang disyorkan: "

Tutorial Video PHP"

Atas ialah kandungan terperinci Ketahui lebih lanjut tentang cara mengoptimumkan parameter konfigurasi nginx php php-fom. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:voycn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam