编译PHP并与nginx整合
安装mysql
yum install mysql-devel
yum install mysql-server
nginx+php的编译
apache一般是把php当做自己的一个模块来启动的.
而nginx则是把http请求变量(如get,user_agent等)转发给 php进程,即php独立进程,与nginx进行通信. 称为 fastcgi运行方式.
因此,为apache所编译的php,是不能用于nginx的.
如果已经在apache下安装了php,需要
make clean
原因上面已经解释过了
需要用到什么可以
cd php-5.4.19
//编译软件一遍通过这个方式查看,即将输出的mysqlnd php原生的mysql
./configure -help | grep mysql
-- with-mysql=DIR 是否需要mysql的支持
--enable-mysqlnd 是否开启mysqlnd
./configure -help | grep gd
//如果没有安装
yum install gd
注意: 我们编译的PHP 要有如下功能:
连接mysql, gd(画图), ttf(文字功能), 以fpm(fascgi)方式运行
命令行输入
./configure --prefix=/usr/local/fastphp \
--with-mysql=mysqlnd \
--enable-mysqlnd \
--with-gd \
--enable-gd-native-ttf \
--enable-gd-jis-conv
//一定要这一行,说明是fpm形式运行
//为什么一定要用fpm形式,因为php和nginx是两个独立的进程
--enable-fpm
//如果安装过程中穿什么问题就把/usr/local/fastphp \文件删除重新开始
如果以上步骤,有报错configure:error:phg.h not found
,运行yum install hd-devel
nginx+php的配置比较简单,核心就一句话----把请求的信息转发给9000端口的PHP进程, 让PHP进程处理 指定目录下的PHP文件.
如下例子:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
//这里的document_root是上面定义的root html
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
1:碰到php文件,
2: 把根目录定位到 html,
3: 把请求上下文转交给9000端口PHP进程,
4: 并告诉PHP进程,当前的脚本是 documentrootdocument_rootdocumentrootfastcgi_scriptname
(注:PHP会去找这个脚本并处理,所以脚本的位置要指对)
最后执行
make && make install
编译完毕后:
将php的配置文件复制到fastphp目录
cd /usr/local/fastphp
cp /user/local/src/php-5.4.19/hph.ini-development ./lib/php.ini
//下面有两个配置文件php.ini-development 开发环境 php.ini-production产品环境
ls sbin/
//如果上面编译成功的话,发现目录下有php-fpm
ls etc/
//如果上面编译成功的话,目录下有pear.conf php-fpm.conf.default
cp etc/php-fpm.conf.default etc/php-fpm.conf
./sbin/php-fpm
ps aux |gerp php
//发现有php-fpm
配置location
location ~ \.php$ {
root html;
//fastcgi就是nginx和php互通信息用的
//如果访问的是xxx.php就重定向到9000端口,即php进程
fastcgi_pass 127.0.0.1:9000;
//默认主页
fastcgi_index index.php;
//这里的document_root是上面定义的root html
//告诉php进程想运行哪个php页面
//运行html目录下对应的php文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
//这个参数这行必须有,因为这些参数是nginx和php之间互通信息用的
include fastcgi_params;
}
测试:
vim html/test.php
//输入
<?php
phpinfo();
页面访问 192.168.xx.xx/test.php
成功的话会输出php的详细信息。
启动mysql
service mysql start
安装ecshop(这是一个多年前php的项目貌似,作为java开发的我暂时不去关心)
上传ecshop文件并解压
//将解压的ecshop放到nginx的html下面,并重命名
mv ecshop-ori /usr/local/nginx/html/ecshop
vim conf/nginx.conf
location /{
//index中添加一个index.php,尝试去加载index.php
index index.php
}
访问:192.168.xxx.xxx/ecshop 就会自动跳转到192.168.xxx.xxx/ecshop/install/index.php
开始安装
进入如上的页面后,点击下一步,发现有报错
//给权限
cd /usr/local/nginx/html/ecshop
chmod o+w cert -R
chmod o+w images -R
chmod o+w data -R
chmod o+w temp -R
chmod o+w themes -R
填写管理员、邮箱等相关信息,最后点击立即安装
如上图所示,点击搜能够查看数据库是否有效,如果是localhost会报错,是真实ip的话就不会报错。
原因
在linux下mysql用localhost连接的时候,不是通过tcp协议连接的,而是用socket连接的。
vim /usr/local/fastphp/php/lib/php.ini
//搜索socket,修改如下
mysql.defaut_socket = /var/lib/mysql/mysql.socket
//杀掉进程
pkill -9 php-fpm
//重启
/usr/local/fastphp/sbin/php-fpm
最后点击”立即安装“的时候还是会报错,
vim /usr/local/fastphp/php/lib/php.ini
//搜索timezone,修改为如下
date.timezone = PRC
//杀掉进程
pkill -9 php-fpm
//重启
/usr/local/fastphp/sbin/php-fpm
然后在点击立即安装,完成之后返回首页,
还是会报一些错,因为ecshop是几年前的了。
cd html
rm -rf ecshop
cd /usr/local/src/
rm -rf ecshop-ori
unzip ecshop-ori.zip
mv exshop-ori /usr/local/nginx/html/ecshop
cd /usr/local/nginx/html/ecshop
vim includs/ini.php
//修改
error.reporting(0)
@ini_set('display_errors',0);
//从下面的if这里删除到下个注释”判断是否只会Gzip 格模式“中间的内容
if((DEBUG_MODE & 1 )==1)
...
/*判断是否只会Gzip 格模式*/
然后重新安装一次
点击安装后还是会报错
cd /usr/local/nginx/html/ecshop
vim install/includs/index.php
//修改如下内容
@ini_set('display_errors',0);
error.reporting(0)
商城url重写实战
普通的get请求,http://xxxxx:xxxx/a?id=1,希望在地址栏写成http://xxxxx:xxxx/a-1.html,nginx自动重定向
Rewrite语法
Rewrite 正则表达式 定向后的位置 模式
Goods-3.html ---->Goods.php?goods_id=3
goods-([\d]+).html —> goods.php?goods_id =$1
location /ecshop {
index index.php;
rewrite goods-([\d]+).html$ /ecshop/goods.php?id=KaTeX parse error: Expected 'EOF', got '\d' at position 22: …rite article-([\̲d̲]+)\.html /ecshop/article.php?id=$1;
rewrite category-(\d+)-b(\d+).html /ecshop/category.php?id=$1&brand=$2;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d.]+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d+.])-(\d+)-([-]+)-([-]+).html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8;
}
注意:用url重写时, 正则里如果有”{}”,正则要用双引号包起来
允许正则表达式前面的通过"()"包起来,正则引擎就会记住,在后面可以进行引用,这叫做 反向引用
vim cong/nginx/conf
location /ecshop{
//goods-数字.html 这里的数字有1-7位, 就重定向到goods.php?id=$1
rewrite "goods-(\d{1,7})\.html" /ecshop/goods.php?id=$1
}
//更复杂的url的重定向,可以依据类似的方法
//即$1 $2 $3 ....