10-编译PHP并与nginx整合
nginx的URL重写。nginx+PHP的配置也是不可不学的部分。PHP自己手动编译,mysql就自己yum了。
yum install 安装mysql
同时进行php的编译,手动编译php
这么多的选项不要记,记也没用。你随时编译什么软件你看它的configure -help,帮助,是否包含mysql的支持?DIR是mysql的base(基础目录),php自带了原生的mysql驱动,不需要依赖于mysql的目录了。你要是想用原生的mysql驱动可以指定为mysqlnd。如果mysqli没有值默认为mysqlnd。肯定得开启mysqlnd。
还需要gd库支持,这些东西你需要什么就随时去找。死记硬背是没有任何意义的。你的gd库装在哪里?你手动装的gd那你指定,你要是没有手动编译gd那你直接先yum安装一下。
得清除yum源并且重新配置本地光盘为yum源
ttf是写字的,字体功能,gd是画图,画图上你想写字还得有字体。
安装字体相关的软件
把ttf的选项--enable-gd-native-ttf加上去php的编译命令
再看看有没有安装freetype
编译安装php的命令:./configure --prefix=/usr/local/fastphp \
--with-mysql=mysqlnd \
--enable-mysqlnd \
--with-gd \
--enable-gd-native-ttf \
--enable-gd-jis-conf
至此,把php编译在哪里,mysql要支持,gd库要支持,字体库要支持,可以动手编译了。
缺少了libxml2,编译不成功
libxml2已经安装了
yum clean all之后删除掉packagekit-media.repo就意味着yum源被重新配置了,然后yum安装libxml2-devel成功
重新编译安装php又报错了,少了png.h,png.h是头文件,头文件少了肯定是缺少了devel系列的包。没有头文件,头文件里面有一些数据结构它必须要利用。
经查资料说是libpng,devel包没安装,执行下面两条命令即可解决yum install libpng,yum install libpng-devel,然后重新编译安装就行了
又报这个错,还是重新配置yum源吧。
又来了,不断地重复yum clean all然后删除掉packagekit-media.repo以重新配置yum源。
安装libpng-devel成功了
编译安装PHP成功
试一下安装gd-devel
又来了,又是yum源的问题
重新配置yum源之后再安装,没有gd-devel的包可以安装。
编译安装php的命令应该改为:./configure --prefix=/usr/local/fastphp \
--with-mysql=mysqlnd \
--enable-mysqlnd \
--with-gd \
--enable-gd-native-ttf \
--enable-gd-jis-conv
经过漫长的等待,php终于编译成功了,编译完毕了。
php不是要以一个进程的方式在跑吗?管理php进程的那个东西叫做fastcgi_process_manager程序,它现在没有给我们产生conf。
嘴里念叨着四个选项还是少了些选项。你得说你是fpm形式,它才能以独立进程编译。
使用新的选项
修改配置php的命令:
./configure --prefix=/usr/local/fastphp \
--with-mysql=mysqlnd \
--enable-mysqlnd \
--with-gd \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-fpm
必须要声明enable-fpm才可以,然后用新的选项把它configure,make&&make install
编译安装
一不小心落了一个参数,二十分钟白费了,又要重新编译。一定要在编译之前好好看看你的参数。为什么非得加fpm?因为nginx和php是平级的,都是各自独立的进程,所以要把php编译成fpm的形式。
整合php和nginx
因为nginx和php是两个独立的进程,因此它俩要通信要说话。
不灵
进行调试
修改:
为什么差一点就不行?fastcgi通俗意思是两个程序之间说话,程序之间说话肯定少不了N多变量而且是约定成俗的变量。刚才你要是不包含的话(include fastcgi_params)会少了很多东西。缺少了很多变量PHP不知道怎么解释,你得给人充分的变量才行。
PHP已经安装成功了
gd库已经安装了
mysql也支持
有mysql有gd库就已经够了,现在php已经安装完毕了。和nginx也整合完毕了。
启动mysql失败
还差一个,刚才装的只是客户端,还要装mysql-server。
mysql-server服务器和mysqld已经安装,查看mysql日志应该是磁盘空间满了,删除掉之前nginx日志切割课程的日志文件应该就可以了。经查nginx日志才147KB,看来不是大容量文件。
nginx和php是怎么配合的?
php是嵌入式嵌入apache当做它的小功能块。nginx和php的关系是平等的。php占着9000端口当做一个独立的进程在运行着。nginx收到请求发现想运行php,把你的相关请求信息原封不动地送给php。php处理完毕再返回给nginx,nginx再返回给用户。这是两者的不同之处。针对.php文件做一次转发,转发给php进程。nginx和php是相互独立的,只要碰到.php的请求直接原封不动转给php进程来请求。不等php编译好先去帮nginx配置。知道原理了又会location了你就知道该怎么做了。
配置nginx 配置nginx.conf
正则匹配,当碰到.php的时候,这件事不能由我处理了,得由php进程来处理了。php进程运行的时候在哪一个端口?咱们应该告诉人家。fastcgi就是你接收到的这一系列请求的上下文的变量,通过9000端口来处理。9000端口将是谁来运行呢?就是由php来运行。
当location(定位),当它碰到.php的这种文件的时候,它就把浏览器给它的一系列信息原封不动地给9000端口,让9000端口去处理。给9000端口去处理的时候你总得让php这个进程知道你来找a.php还是b.php,你得让人家知道你来找哪个php啊。所以cgi里面有一个参数,这是cgi标准定的,cgi里面有一个参数叫做fastcgi_script_name,就告诉了php说你去找/scripts$fastcgi_script_name(scripts目录下的fastcgi_script_name这个文件名)。scripts目录是干什么的?就是你的php放哪个目录你得说清楚。总之这个location是:现在有人要访问php文件,原封不动地把它转到9000端口,同时告诉这个9000端口我要找的是$document_root$fastcgi_script_name这个文件名来执行。也就是说9000端口的php请帮我执行$docuemnt_root$fastcgi_script_name这个php,执行结果返回给nginx。
实际上原理就是说: