首页 > nginx > nginx php-fpm安装配置

nginx php-fpm安装配置

2012年9月21日 发表评论 阅读评论

nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx

本文以php-fpm为例介绍如何使nginx支持PHP

一、编译安装php-fpm

什么是PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

新版PHP已经集成php-fpm了,不再是第三方的包了,推荐使用。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这里

安装前准备
centos下执行

新版php-fpm安装(推荐安装方式)

旧版手动打补丁php-fpm安装(旧版程序已经没有了,大家新版的吧,这里做个展示)
wget http://cn2.php.net/get/php-5.2.17.tar.gz
wget http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
tar zvxf php-5.2.17.tar.gz
gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -d php-5.2.17 -p1
cd php-5.2.17
./configure --prefix=/usr/local/php -with-config-file-path=/usr/local/php/etc
-with-mysql=/usr/local/mysql
-with-mysqli=/usr/local/mysql/bin/mysql_config -with-openssl -enable-fpm -enable-mbstring
-with-freetype-dir -with-jpeg-dir -with-png-dir -with-zlib-dir -with-libxml-dir=/usr -enable-xml
-with-mhash -with-mcrypt -enable-pcntl -enable-sockets  -with-bz2 -with-curl -with-curlwrappers
-enable-mbregex -with-gd -enable-gd-native-ttf -enable-zip -enable-soap -with-iconv -enable-bcmath
-enable-shmop -enable-sysvsem -enable-inline-optimization -with-ldap -with-ldap-sasl -enable-pdo
-with-pdo-mysql
make all install

以上两种方式都可以安装php-fpm,安装后内容放在/usr/local/php目录下

以上就完成了php-fpm的安装。

下面是对php-fpm运行用户进行设置

修改
user = www-data
group = www-data

如果www-data用户不存在,那么先添加www-data用户
groupadd www-data
useradd -g www-data www-data

二、编译安装nginx

然后按照http://blog.redis.com.cn/install 安装nginx

三、修改nginx配置文件以支持php-fpm

nginx安装完成后,修改nginx配置文件为,nginx.conf

其中server段增加如下配置,注意标红内容配置,否则会出现No input file specified.错误

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

四、创建测试php文件

创建php文件

在/usr/local/nginx/html下创建index.php文件,输入如下内容

五、启动服务

启动php-fpm和nginx

php-fpm关闭重启见文章结尾

六、浏览器访问

访问http://你的服务器ip/index.php,皆可以见到php信息了。

安装php-fpm时可能遇到的错误:

1. php configure时出错

configure: error: XML configuration could not be found

2. Please reinstall the BZip2 distribution

3. php的配置文件中有一行--with-mysql=/usr
安装的时候提示:
configure: error: Cannot find MySQL header files under yes.
Note that the MySQL client library is not bundled anymore.

这是由于安装mysql时没有安装mysql头文件,或者是路径指定不正确,php找不到mysql的头文件引起的错误提示。
解决方法。
(1.) 查看你的系统有没有安装mysql header
find / -name mysql.h
如果有。请指定--with-mysql=/跟你的正常路径。
如果没有。请看下一步。
(2.)redhat安装
rpm -ivh MySQL-devel-4.1.12-1.i386.rpm
(3.)ubuntu安装
apt-get install libmysqlclient15-dev
(4.)最后一步php的配置选项添加--with-mysql=/usr即可!

4.No input file specified.

location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

5. 如果php configure时缺库,可以先安装库(ubuntu下)

sudo apt-get install make bison flex gcc patch autoconf subversion locate
sudo apt-get install libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev

6. mcrypt.h not found. Please reinstall libmcrypt

apt-get install libmcrypt-dev

或者

cd /usr/local/src
wget http://softlayer.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gz
tar -zxvf libmcrypt-2.5.8.tar.gz
cd /usr/local/src/libmcrypt-2.5.8
./configure --prefix=/usr/local
make
make install

7. php-fpm 5.4.7 如何关闭 重启?

php 5.4.7 下的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令,需要使用信号控制:

master进程可以理解以下信号

INT, TERM 立刻终止 QUIT 平滑终止 USR1 重新打开日志文件 USR2 平滑重载所有worker进程并重新载入配置和二进制模块

示例:

php-fpm 关闭:

kill -INT cat /usr/local/php/var/run/php-fpm.pid

php-fpm 重启:

kill -USR2 cat /usr/local/php/var/run/php-fpm.pid

查看php-fpm进程数:

ps aux | grep -c php-fpm

8.命令行下执行php,提示找不到命令

-bash: /usr/bin/php: No such file or directory

vi /etc/profile

在文件底部增加一行配置
export PATH=/usr/local/php/bin:$PATH

保存退出

source /etc/profile

分类: nginx 标签:
  1. mood
    2020年9月17日15:46 | #1
  2. Norman
    2020年9月1日14:35 | #2

    楼主大大 有没有PHP7.2的安装教程啊!好像PHP7.2改了好多

  3. gfdgdfgffsd
    2017年11月21日14:50 | #3

    防守打法的山东师范

  4. fsfsdfds
    2017年11月21日14:50 | #4

    用phpinfo函数看一下

  5. gdgdfgdf
    2017年11月21日14:49 | #5

    学习咯!

  6. gdgdfgdf
    2017年11月21日14:49 | #6

    简洁精辟

  7. 59d5a847a10edfe303bbedbfc94b8cc4
    2017年11月21日14:47 | #7

    好好玩!

  8. asdfasdfasdfasdfasdfasdfasdfasdf
    2017年11月21日14:46 | #8

    学习了!!!

  9. simuhunluo
    2017年11月15日00:06 | #9

    @寂寞侵蚀的岁月
    那是在开始配置./configure的时候没有引入fpm

  10. 西门吹牛
    2016年8月11日17:47 | #10

    centos7 安装好之后访问的时候页面不出来phpinfo页面,而是出现了index.php文件中的代码,经检查后发现,楼主代码为:
    <?php
    echo phpinfo();
    ?>
    将代码改为:
    <?php
    echo phpinfo();
    ?>
    问题解决。

  11. 2016年7月7日11:31 | #12

    7.0 的php安装后找不到fpm

  12. 2016年3月11日14:19 | #13

    感谢楼主

  13. 2016年3月4日23:44 | #14

    楼主你好,在phpinfo()中看到Configuration File (php.ini) Path指向/usr/local/php/lib 目录,但是在该目录下却没看到php.ini配置文件,且从根目录开始查找也没找到这个配置文件,这是为什么??

  14. 天边的乌云
    2015年12月2日17:14 | #17

    虽然我刚刚安装好了,博主说的问题都遇到了,确实比较详细。

  15. 2015年5月9日16:57 | #18

    楼主,我想问下
    1、打开--enable-pcntl,不手动编译pcntl.so扩展,pcntl_fork函数是不支持的,为啥呢?
    2、打开pcntl后,php-fpm.conf进程管理是否可以配置为静态?
    望广大网友帮忙解惑。非常感谢。

  16. 蒙太奇葩
    2015年4月13日18:12 | #19

    十分感谢,文章简洁明了,一路很顺。

  17. 2015年2月23日20:17 | #20
  18. 2015年2月23日14:50 | #21

    lz用什么源?

  19. 2015年2月23日12:39 | #23

    新版php安装时出现make: *** No rule to make target `all'. Stop.如何解决?

    • 农民
      2015年4月11日22:14 | #24

      这个问题解决了吗?我也遇到了

  20. 山里的娃
    2014年12月28日18:07 | #25

    请问一下:我的nginx和php都安装好了,phpinfo的测试页面也能正常显示,但是为啥将WordPress的内容放到html目录下面,访问的时候就会返回500错误?

  21. 2014年5月18日23:19 | #27

    我安装好了mysql 并且mysql没报任何错误也能正常运行。在/usr/local/mysql/include/mysql/mysql.h 也是有的。但是在编译php的时候 总是报
    configure: error: Cannot find MySQL header files under /usr.
    Note that the MySQL client library is not bundled anymore!
    我php ./configure --with-mysql=/usr/local/mysql --with-mysql=/usr --with-mysql 这三个方式都试过还是不行
    请问这个是怎么回事呢

    • 2014年5月18日23:30 | #28

      我自己在网上找的解决办法 yum install mysql-devel这样就完全通过了不知道为什么会差这个东西就不行。。

    • 海盗窝
      2015年3月19日09:09 | #29

      --with-mysql=mysqlnd --with-mysqli=mysqlnd 试下。

  22. 2014年5月12日09:58 | #30

    你的wp是用nginx搭建的吗?

  23. Victor
    2014年1月5日19:00 | #33

    make: *** No targets specified and no makefile found. Stop.

    安装前准备 都已经安装了 。这个问题这么解决呢??

  24. victor
    2014年1月5日18:27 | #34

    make: *** No targets specified and no makefile found. Stop.

    shi weishenme a ???

  25. 2013年12月29日23:28 | #36

    阿里云 CenterOS,前面的准备工作也作了,也按照“6. mcrypt.h not found. Please reinstall libmcrypt”的解决方案操作了,但执行编辑的时候仍然提示:configure: error: mcrypt.h not found. Please reinstall libmcrypt. 求解!

  26. CaenZhang
    2013年12月12日17:42 | #38

    [12-Dec-2013 16:57:29] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
    ----这是什么情况啊?求解!!!

  27. 2013年11月11日10:17 | #43

    版主真心不错!愿意贡献知识!!!!

  28. ys165
    2013年10月8日00:47 | #44

    怎么优化呢?有没有优化方面的介绍?

    • 2013年10月10日14:08 | #45

      优化需要针对具体情况具体分析,可以说说你的情况

  29. asdf
    2013年9月28日21:33 | #46

    博主,我按你的方法安装后发现freetype 和jpeg不能用。

    • 2013年9月29日09:04 | #47

      安装前的准备工作,你做了吗?

      • asdf
        2013年9月29日11:08 | #48

        前面的东西都安装了,但是freetype还是不能用,imagettftest还i是报错,phpinfo 查看gd里面没freetype

      • asdf
        2013年9月29日11:10 | #49

        尝试在安装php的时候加了选项 --with-freetype-dir=/usr/include/freetype2/freetype/ 没报错,但是还是不可用

      • asdf
        2013年9月29日11:29 | #50

        ./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt --enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli --with-gd --enable-gd-native-ttf --with-png-dir --with-freetype-dir=/usr/include/freetype2/freetype/ --with-jpeg-dir

        make clean
        make
        male install
        搞定了

  30. asdf
    2013年9月13日12:18 | #52

    安装完后如何添加mysqli扩展呢??

    • 2013年9月13日12:55 | #53

      重新编译一遍,configure是带上--with-mysqli参数。

      • asdf
        2013年9月13日15:16 | #54

        感谢博主回复,文件解决了,但是我关闭php-fpm报错:
        -bash: kill: cat /usr/local/php/var/run/php-fpm.pid: arguments must be process or job IDs;
        发现/usr/local/php/var/run/php-fpm.pid这个文件不存在;

  31. 2013年8月30日14:14 | #56

    configure: WARNING: unrecognized options: --with-jpeg 应该是目录

  32. 2013年8月29日11:50 | #58

    我的php运行起来为什么找不到PID,写进系统程序时没法stop

  33. 无忌
    2013年8月13日19:40 | #61

    <? echo phpinfo(); ?> 请修改这行代码 <?php echo phpinfo(); ?>

    • mood
      2013年8月14日16:53 | #62

      谢谢,已更新

    • 2013年8月20日10:37 | #63

      这行代码无问题。

      • Filix
        2013年8月29日22:23 | #64

        是没问题,但是短标签是不建议的。
        有些情况会出现问题,比如把php文件当模版时输出XML。因为xml的申明就是<? XML .........
        另外phpinfo是没有返回值的,不需要echo

  34. 2013年8月7日14:57 | #65

    安装完成 php 怎么没有找到php.ini 文件啊

  35. 小飞
    2013年7月18日15:38 | #68

    这么好的文章,果断收藏了。

  36. 草泥马
    2013年7月16日08:21 | #69

    简洁精辟!

  37. 2013年5月18日14:14 | #70

    学习咯

  1. 2012年12月31日21:03 | #1
  2. 2013年6月5日16:16 | #2
  3. 2013年7月23日22:58 | #3
  4. 2013年8月1日13:14 | #4
  5. 2013年8月24日09:31 | #5
  6. 2013年10月30日00:37 | #6
  7. 2013年10月30日00:40 | #7
  8. 2013年12月1日11:00 | #8
  9. 2013年12月13日10:57 | #9
  10. 2014年1月30日20:22 | #10
  11. 2014年1月30日20:55 | #11
  12. 2014年5月25日19:10 | #12
  13. 2014年5月25日19:32 | #13
  14. 2014年6月9日13:44 | #14
  15. 2014年8月22日12:11 | #15
  16. 2014年11月20日22:18 | #16
  17. 2014年11月28日09:40 | #17
  18. 2014年12月24日16:47 | #18
  19. 2015年1月8日10:23 | #19
  20. 2015年6月17日17:19 | #20
  21. 2015年7月3日18:35 | #21
  22. 2015年7月5日16:22 | #22
  23. 2015年7月26日13:22 | #23
  24. 2015年7月30日21:48 | #24
  25. 2015年8月2日12:16 | #25
  26. 2015年9月2日22:10 | #26
  27. 2015年12月22日11:41 | #27
  28. 2016年1月13日16:58 | #28
  29. 2016年2月28日14:42 | #29
  30. 2016年3月23日23:28 | #30
  31. 2016年7月16日17:48 | #31
  32. 2016年7月17日06:49 | #32
  33. 2016年7月29日11:39 | #33
  34. 2016年7月29日15:33 | #34
  35. 2016年8月3日14:42 | #35
  36. 2016年12月13日16:30 | #36
  37. 2017年1月2日16:18 | #37
  38. 2017年1月22日15:20 | #38
  39. 2017年3月3日17:14 | #39
  40. 2017年5月8日18:24 | #40
  41. 2017年10月19日16:38 | #41
  42. 2017年11月1日11:13 | #42
  43. 2018年9月13日23:34 | #43
  44. 2019年6月1日11:11 | #44
  45. 2019年7月7日21:57 | #45