nginx和php-fpm通信,使用unix socket還是TCP?

2022-02-01 php中文網最新課程

前言

nginx和fastcgi的通信方式有兩種,一種是TCP的方式,一種是unix socke方式。兩種方式各有優缺點,這裡先給出兩種的配置方法,然後再對性能、安全性等做出總結。

TCP是使用TCP埠連接127.0.0.1:9000

Socket是使用unix domain socket連接套接字/dev/shm/PHP-cgi.sock(很多教程使用路徑/tmp,而路徑/dev/shm是個tmpfs,速度比磁碟快得多),在伺服器壓力不大的情況下,tcp和socket差別不大,但在壓力比較滿的時候,用套接字方式,效果確實比較好。

配置指南

一、TCP配置方式

TCP通信配置起來很簡單,三步即可搞定

第一步,編輯 /etc/nginx/conf.d/你的站點配置文件(如果使用的默認配置文件,修改/etc/nginx/sites-available/default)

將fastcgi_pass參數修改為127.0.0.1:9000,像這樣:

location ~ \.php$ {
index index.php index.html index.htm;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}

第二步,編輯php-fpm配置文件 /etc/php5/fpm/pool.d/www.conf

將listen參數修改為127.0.0.1:9000,像這樣:

第三步,重啟php-fpm,重啟nginx

二、unix socket配置方式

unix socket其實嚴格意義上應該叫unix domain socket,它是*nix系統進程間通信(IPC)的一種被廣泛採用方式,以文件(一般是.sock)作為socket的唯一標識(描述符),需要通信的兩個進程引用同一個socket描述符文件就可以建立通道進行通信了。

Unix domain socket 或者 IPC socket是一種終端,可以使同一臺作業系統上的兩個或多個進程進行數據通信。

與管道相比,Unix domain sockets 既可以使用字節流和數據隊列,而管道通信則只能通過字節流。

Unix domain sockets的接口和Internet socket很像,但它不使用網絡底層協議來通信。Unix domain socket 的功能是POSIX作業系統裡的一種組件。

Unix domain sockets 使用系統文件的地址來作為自己的身份。它可以被系統進程引用。所以兩個進程可以同時打開一個Unix domain sockets來進行通信。

不過這種通信方式是發生在系統內核裡而不會在網絡裡傳播。

配置需要五步

第一步,決定你的socket描述符文件的存儲位置。

可以放在系統的任意位置,如果想要更快的通信速度,可以放在/dev/shm下面,這個目錄是所謂的tmpfs,是RAM可以直接使用的區域,所以,讀寫速度都會很快。

決定了文件位置,就要修改文件的權限了,要讓nginx和php-fpm對它都有讀寫的權限,可以這樣:

sudo touch /dev/shm/fpm-cgi.sock
sudo chown www-data:www-data /dev/shm/fpm-cgi.sock
sudo chmod 666 /dev/shm/fpm-cgi.sock

第二步,修改php-fpm配置文件/etc/php5/fpm/pool.d/www.conf

將listen參數修改為/dev/shm/fpm-cgi.sock,像這樣:

listen=/dev/shm/fpm-cgi.sock

將listen.backlog參數改為-1,內存積壓無限大,默認是128,並發高了之後就會報錯
; Set listen(2) backlog. A value of '-1' means unlimited.
; Default Value: 128 (-1 on FreeBSD and OpenBSD)
listen.backlog = -1

將fastcgi_pass參數修改為unix:/dev/shm/fpm-cgi.sock,像這樣:
location~\.php${
indexindex.phpindex.htmlindex.htm;
include/etc/nginx/fastcgi_params;
fastcgi_passunix:/dev/shm/fpm-cgi.sock;
fastcgi_indexindex.php;
includefastcgi_params;
}

第四步,修改/etc/sysctl.conf 文件,提高內核級別的並發連接數
sudo echo'net.core.somaxconn = 2048'>>/etc/sysctl.conf
sudo sysctl-p

第五步, 重啟nginx和php-fpm服務(最好先重啟php-fpm再重啟nginx)ps:如果nginx做要做負載均衡的話,根本也不要考慮unix socket的方式了,只能採用TCP的方式。

-END-

▼請點擊下方:「閱讀原文」,在線查看全部文章內容!

相關焦點

  • PHP-FPM 與 Nginx 的通信機制總結
    Nginx 與 php-fpm 的結合在 Linux 上,nginx 與 php-fpm 的通信有 tcp socket 和 unix socket 兩種方式。tcp socket 的優點是可以跨伺服器,當 nginx 和 php-fpm 不在同一臺機器上時,只能使用這種方式。
  • 全面剖析 PHP-FPM+Nginx 通信原理
    fastcgi_pass unix:/tmp/php-cgi.sock;它其實是Nginx和PHP-FPM一個通信載體(或者說通信方式),目的是為了讓Nginx知道,收到動態請求之後該往哪兒發。php-fpm和nginx一樣,也會監聽埠(通過nginx.conf裡的配置我們知道,nginx默認監聽8080埠,php-fpm默認監聽9000埠),並且有master和worker進程,worker負責處理每一個php請求關於fastcgi:fastcgi是一個協議。市面上有多種實現了fastcgi協議的進程管理器,php-fpm就是其中的一種。
  • 502錯誤,讓你進一步明白nginx和php-fpm之間的關係
    (3)定位問題知道了nginx通過本地socket方式連接php-fpm遇到權限問題,定位到了listen.owner和 listen.group指令。產生問題的原因就是nginx進程的屬主和php-fpm屬主權限不一樣,在發生502問題的時候,nginx屬主是www-data,而listen.owner是www。把它們修改一致後,問題解決。
  • php-fpm詳解
    如果沒有設置或者為空,則允許任何伺服器請求連接listen.owner = wwwlisten.group = wwwlisten.mode = 0666#unix socket設置選項,如果使用tcp方式訪問,這裡注釋即可。
  • PHP 連接方式介紹以及如何攻擊 PHP-FPM
    ,第三張圖的 FPM 代表了 php-fpm 進程的 fastcgi 模式一般來說,apache 伺服器常用 module 方式起 php,nginx 伺服器常用 fastcgi 模式起 php,所以接下來我已 nginx 為例php-fpm 的模式是不是很繞,php-fpm 下還可以繼續分,如果使用 fastcgi 模式,nginx 與 php-fpm 通信可以通過兩種模式
  • php-fpm的配置和優化
    daemonize = yes#後臺執行fpm,默認值為yes,如果為了調試可以改為no。在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。listen = 127.0.0.1:9000#fpm監聽埠,即nginx中php處理的地址,一般默認值即可。
  • php-fpm rce攻擊
    apache 也可以設置為 php-fpm 方式mod_php 通過嵌入 PHP 解釋器到 apache 進程中,只能與 apache 配合使用而 cgi 和 fast-cgi 以獨立的進程的形式出現,只要對應的Web伺服器實現 cgi 或者 fast-cgi 協議,就能夠處理 PHP 請求0x01 PHP-FPM 的模式nginx 與 php-fpm 通信可以通過兩種模式
  • php環境搭建(正確配置nginx和php)
    在該項中設置了fastcgi_pass相關參數,將用戶請求的資源發給php-fpm進行解析,這裡涉及到nginx FastCGI模塊的相關配置語法下文會介紹)。而具體的 URI 及參數是在 REQUEST_URI 中傳遞給 FastCGI 和 WordPress 程序的,因此不受 URI 變化的影響!!!!。
  • 如何利用PHP-FPM實現open_basedir繞過
    其中,Ngnix與PHP-FPM有兩種通信方式,分別是TCP與Unix domain sockets模式。在windows系統中只能使用tcp socket的通信方式。Unix domain sockets模式Unix socket 又叫 IPC (inter-process communication 進程間通信) socket,用於實現同一主機上的進程間通信,這種方式需要在 Ngnix配置文件中填寫 PHP-FPM 的 socket 文件位置
  • nginx調用php-fpm的工作原理
    2、對於php而言,由於在整個網絡請求的過程中php是一個cgi程序的角色,所以採用名為php-fpm的進程管理程序來對這些被請求的php程序進行管理。php-fpm程序也如同nginx一樣,需要監聽埠,並且有master和worker進程。worker進程直接管理每一個php進程。3、關於fastcgi:fastcgi是一種進程管理器,管理cgi進程。
  • ubuntu中安裝和配置nginx+php-fpm
    昨天有朋友問,如何安裝和配置nginx,其實非常簡單。
  • php-fpm優化
    ];pid = /var/log/php-fpm/php-fpm.pid #pid文件存放的位置;error_log = /var/log/php-fpm/php-fpm.log #錯誤日誌存放的位置;log_level = error #日誌級別, alert, error, warning, notice, debugrlimit_files = 65535 #php-fpm
  • 用 caddy 代替 nginx, 一行配置搞定 php-fpm 反向代理
    一是當時 nginx 還是非常堅挺, 可以說在 nginx + php-fpm 這一搭配方面, 基本上無敵手. 二是, 當時我試用過 Caddyfile 後,發現它太簡潔了,簡潔到我以配置 nginx 的思維, 完全無法適應配置 Caddyfile. 沒錯, 我當時覺得 , 配置 nginx 比 Caddyfile 簡單多了 (因為 nginx 配置已經熟練多年).
  • 如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安裝 Nextcloud
    php -v查看 PHP 版本號步驟 2 - 配置 PHP7-FPM在這一個步驟中,我們將配置 php-fpm 與 Nginx 協同運行。Php7-fpm 將使用 nginx 用戶來運行,並監聽 9000 埠。使用 vim 編輯默認的 php7-fpm 配置文件。
  • Nginx+Php-fpm運行原理詳解
    Php-fpm是什麼1、cgi、fast-cgi協議cgi的歷史早期的webserver只處理html等靜態文件,但是隨著技術的發展,出現了像php等動態語言。webserver處理不了了,怎麼辦呢?那就交給php解釋器來處理吧!交給php解釋器處理很好,但是,php解釋器如何與webserver進行通信呢?
  • PHP - FPM 應用淺析
    FastCGI 是 Web 伺服器(如:Nginx、Apache)和處理程序之間的一種通信協議,它是與 Http 類似的一種應用層通信協議。注意:FastCGI 只是一種協議!它可以用任何語言實現,只要這些語言能夠接收輸入輸出信息。
  • CTF真題解析丨淺談PHP-FPM
    早期的Web伺服器只處理html等靜態文件,隨著技術發展,出現了像PHP等動態語言,但是Web伺服器並不能處理它,需要一個叫做PHP解釋器的東西來處理,但是PHP解釋器又如何與Web伺服器進行通信呢? 於是CGI協議出現了,它能實現語言解釋器與Web伺服器的通信,比如PHP-CGI,後來又相繼發展出CGI的改良版本Fast-CGI通訊協議。
  • 為高性能優化 PHP-FPM
    這就是為什麼對於這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。也就是說,您可以做很多事情來改進伺服器上的 PHP 性能。本文主要關注 php-fpm 方面的內容,如果您使用 Nginx,這是在伺服器上的默認配置。如果你知道 php-fpm 是什麼,請直接跳到優化部分。什麼是 php-fpm?
  • 【技術分享】深入 FTP 攻擊 php-fpm 繞過 disable_functions
    ,分析了在 php 中利用 ftp 偽協議攻擊 php-fpm ,從而繞過 disable_functions 的攻擊方法,並在文末復現了 [藍帽杯 2021]One Pointer PHP 和 [WMCTF2021] Make PHP Great Again And Again。