Unix的Socket协议

PHP的官方文档中,对于mysql_connect函数的介绍中有这么一条信息:
Note:
只要将 server 指定为 “localhost” 或 “localhost:port”,MySQL 客户端库会越过此值并尝试连接到本地套接字(Windows 中的名字管道)。如果想用 TCP/IP,应该用 “127.0.0.1” 代替 “localhost”。如果 MySQL 客户端库试图连接到一个错误的本地套接字,则应该在 PHP 配置中设定的正确路径并把 server 留空。

看到这里,就捎带着说说Unix的Socket协议吧。

Socket接口或者叫博克利套接字接口,最初在Unix系统中实现的目的是为了进行进程间的通讯,习惯上被define成AF_UNIX或者PF_UNIX。目前大部分的socket套接的通讯方式已经完全兼容TCP/IP,对于本地的访问进程可以通过raw socket的方式访问socket文件就可以方便的进行通讯。相对于TCP/IP这种IP地址+端口号的方式Unix socket的描述符更像是一个文件路径。

例如在php中 mysql_connect(‘localhost’, ‘mysql_user’, ‘mysql_password’); 可以替换为 mysql_connect(‘UNIX:/var/run/mysqld/mysqld.sock’, ‘mysql_user’, ‘mysql_password’); (Ubuntu的默认MysqlSocket的保存路径和Redhat的是不同的,需要注意!)

由于socket的通讯方式相比TCP/IP来说不需要占用带宽,所以在某些情况下可以达到提升性能的目的。而且由于上文所说大部分Socket有意设计的跟TCP/IP协议兼容,故很多情况下可以善用它。

举个例子吧,就说php5.3-fpm + nginx的修改。

默认情况下,php-fpm绑定了本地的9000端口,nginx将请求转发到本地9000号从而实现对php的解析。

我们修改php-fpm.ini文件,如果是apt安装,可以直接修改/etc/php5/fpm/pool.d/www.conf

listen = 127.0.0.1:9000 改为 listen = /var/lib/php5/php-fpm.sock

php5.3以前的php-fpm是一个xml,

<value name=”listen_address”>127.0.0.1:9000</value> 改为 <value name=”listen_address”>/tmp/php-fpm.sock</value>

重起php-fpm之后,netstat -an应该没有了对于9000端口的监听,取而代之的是多了这么一行

unix 2 [ ACC ] STREAM LISTENING 124099 /var/lib/php5/php-fpm.sock

修改nginx配置:

location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/lib/php5/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

重起Nginx,成功!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据