搭建一个陌生的环境是一个非常 Struggling 的过程,各种查资料各种出bug, 不过搞定之后就会觉得学到了挺多东西,反观之前的那些错误会会心一笑觉得自己当初too young, too simple, sometimes naive ~
一、 本地windows 版 环境搭建
1. 安装mysql , 这个没啥问题,上官网下一个然后一直下一步直到finish;
2. 下载php, windows 版本的在:http://windows.php.net/download/ ,根据需要自行选择稳定的版本,注意一个问题是同一版本有不同的型号,5.4之后的都是用VC11编译的,之前的有VC9 和VC6, 这个对windows来说我感觉没多大影响,因为windows下不用自己去编译安装。真正的区别是Thread Safe or Non Thread Safe, 每个版本都有这俩型号,对于Nginx 需要下载的是Non Thread Safe 的版本,对于Apache, IIS 等服 务器是下载Thread Safe版本的。 因为我们项目用到了ThinkPHP3.1 所以至少要下载PHP5.3或以上版本,我下的是php-5.4.33-nts。ThinkPHP3.2则是要求PHP5.4及以上。
3. 下载Nginx 服务器,http://nginx.org/en/download.html , 下载一个稳定版本,我下的是nginx-1.6.2。
上两个文件我都解压到了D:/
4. php.ini 配置
PHP安装目录下有俩配置文件:php.ini.devlelopment 和 php.ini.production,我用的是第一个,把名字中的development 去掉,变成默认的配置文件php.ini. 这个文件里面分号——“;”表示注释。所以你要开启某个选项只要去掉前面的分号就行,我主要改了几个必须的选项:
error_reporting = E_ALL ;//开发过程中让他开启,生产环境中注释掉
display_errors = On
extension_dir = "D:/php-5.4.33-nts/ext" ;//这个是必须要的,因为有些extension 的dll 文件得上这找
cgi.fix_pathinfo=1 ; //因为我们使用nginx 是以FastCGI 的方式,所以得开启这个选项
extension=php_mysql.dll;//用到了mysql , 这俩动态扩展必须添加
extension=php_mysqli.dll;
extension=php_gd2.dll;//用到了GD库来产生验证码,这个得加上
;//以下是常用的一些extension, 都打开
extension=php_pdo_mysql.dll
extension=php_pdo_sqlite.dll
extension=php_bz2.dll
extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_gd2.dll
extension=php_gettext.dll
extension=php_gmp.dll
extension=php_intl.dll
extension=php_imap.dll
extension=php_sockets.dll
extension=php_soap.dll
5. nginx.conf 配置
进入nginx 安装目录的conf 文件夹(D:\nginx-1.6.2\conf)找到这个配置文件,#是注释符,如果你没有复杂的需求,官网上的文档基本就可以满足需求:http://nginx.org/en/docs/beginners_guide.html 。
我们这个项目比较复杂,一个服务器里跑了两种不同URL Mapping的应用,所以多写了一些东西。配置文件的主体结构是这样的:
http {
server {
}
。。。 #可以有多个server, 监听不同的端口的应用
}
我们改的基本都在Server 模块中
server {
listen 80;
server_name localhost;
access_log logs/xx.access.log;
error_log logs/xx.error.log;
rewrite ^(.+)/$ $1;
location / {
root D:/nginx-1.6.2/data/www;
index index.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
break;
}
}
location ~ .+\.php($|/) {
root D:/nginx-1.6.2/data/www/;
set $script $uri;
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
break;
}
}
吐槽:csdn写博客的这个编辑器真不敢恭维,写东西总是错位。。我只能在下面简述一下上面配置
要注意的几个地方:
1. 日志, nginx 在页面上基本显示的东西不够详细,访问日志和错误日志可以详细的看到错的地方;
2. rewrite 加上url 的重写规则的正则表达式
3. location / {
root //代表服务器的根目录,自己找个地儿吧,index 设置成index.php
server name //代表服务器的地址,如果写的是域名的话,通过IP是不能访问的
4. if(!-e $request_filename)重写规则
5. localtion ~ .+\.php { // 所有的php 脚本文件的请求都使用php-cgi来代理解释执行,所以运行时得启动php-cgi.exe
fastcgi_pass 127.0.0.1:9000; // FastCGI默认监听9000端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; //把$script改成这个,不用加'/'
二、 服务器端linux 版 环境搭建6. 启动服务器和FastCGI
命令行进入PHP根目录,输入:php-cgi.exe -b 127.0.0.1:9000 -c php.ini
进入nginx 根目录点击 nginx. exe , 启动nginx
在URL中输入项目的访问地址即可。
也可以在服务器根目录下创建一个phpinfo.php文件,写上
<?php
phpinfo();//显示PHP各种信息
?>
http://localhost/phpinfo.php能出来这个页面就是搞定了:
为了让今后启动和关闭服务器更加便捷,写两个bat文件:start.bat, stop.bat,需要下载RunHiddenConsole.zip包解压到nginx目录内,RunHiddenConsole.exe的作用是在执行完命令行脚本后可以自动关闭脚本。
start.bat:
@echo off
REM Windows 下无效
REM set PHP_FCGI_CHILDREN=5
REM 每个进程处理的最大请求数,或设置为 Windows 环境变量
set PHP_FCGI_MAX_REQUESTS=1000
echo Starting PHP FastCGI...
RunHiddenConsole D:/php-5.4.33-nts/php-cgi.exe -b 127.0.0.1:9001 -c D:/php-5.4.33-nts/php.ini
echo Starting nginx...
RunHiddenConsole D:/nginx-1.6.2/nginx.exe -p D:/nginx-1.6.2
stop.bat:
@echo off
echo Stopping nginx...
taskkill /F /IM nginx.exe > nul
echo Stopping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul
exit
以后双击这俩文件就行了。
服务器Linux系统是CentOS的,yum库比较旧,php5.3是最新, 所以得找其他的源来安装php5.4以上。此处要注意一个问题,最好最好先安装mysql, 然后再安装php, 不然要很悲剧的要再编译生成msql.so (等价于windows 中的php_mysql.dll,如果不幸你丫已经先装了php 请先看:http://www.cnblogs.com/wangtao_20/archive/2011/03/07/1973621.html)
1. 源码安装mysql 5.6
--先下载mysql5.6的源码:
下载地址:http://dev.mysql.com/downloads/mysql/ 我们用的是Generic Linux 31.5M那个。
-- 源码安装
教程一: http://blog.163.com/liyinhui20080527@126/blog/static/815232582013885310900/
这个帖子是找到的最佳的解决方案,注意在Linux下先添加mysql 用户,然后在数据库中使用该用户。
-- 导入数据
CREATE USER 'mysql'@'%' INDENTIFIED BY 'mysql'; //创建用户
CREATE DATABASE db;//创建数据库
USE db;
SOURCE db.sql; //导入数据
GRANT ALL ON db.* TO 'mysql'@'%' ;//授权该用户在任何机器都可以访问数据库db.
2.编译安装PHP5.5 & Nginx
这个教程帖子写的好的我已经无以复加了,直接贴上来吧:
教程二: http://www.woyaohuijia.cn/show/58.html
3. 配置php.ini 与nginx.conf
-- php.ini基本跟windows类似,只是所有的.*dll文件在linux 下是*.so 文件基本集成到了php中,不用手动添加到自启动
error_reporting = E_ALL ;//开发过程中让他开启,生产环境中注释掉
display_errors = On
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212" ;//这个跟windows区别一下
cgi.fix_pathinfo=1; //因为我们使用nginx 是以FastCGI 的方式,所以得开启这个选项
-- nginx.conf
跟windows版的配置一模一样即可
4. phpMyAdmin 加入
phpMyAdmin可以在web页面管理数据库,非常方便,配置也非常简单。
--先下载最新的稳定版本PhpMyAdmin;
--然后配置config.inc.php这个文件,修改几个参数
$cfg['Servers'][$i]['auth_type']= 'http'; //http not cookie
$cfg['Servers'][$i]['host']= 'localhost';
$cfg['Servers'][$i]['connect_type']= 'tcp';
$cfg['Servers'][$i]['compress']= false;
$cfg['Servers'][$i]['AllowNoPassword']= true; //allow no password;
ps: 其他的什么用户名密码都注释掉,因为写在上面很容易泄露
--将项目放置到nginx服务器目录下,我是放在了/nginx/html的目录下:
然后配置nginx.conf 将phpmyadmin 加入到服务器中运行,因为我有一个项目有重写规则,跟phpmyadmin的URL访问冲突,故我在配置文件中新加入一个server, 端口改成8888,让服务器也监听这个端口,而不受另一个项目URL的影响。
server {
listen 8888;
server_name localhost;
access_log /var/log/phpmyadmin_access.log;
error_log /var/log/phpmyadmin_error.log;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
#particular setting for phpmyadmin visiting
location /phpmyadmin {
root /usr/share/nginx/html;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
5. 启动服务
service nginx start
/usr/local/php5/sbin/php-fpm
查看端口是否在监听
netstat -lntp | grep 9000 //看php-cgi 是否启动, nginx 监听的是80端口
每次修改完配置文件都要重启服务:
service nginx restart
pkill php-fpm
/usr/local/php5/sbin/php-fpm
注意:在centos 中php5.3 不支持这么启动,它是默认把它加入了自启动目录:/etc/init.d/php-fpm 是它的启动脚本。所以每次启动时,只要
./php-fpm start / restart / stop
ps 纠结史,按上述方法装成功的可以不用看:
我以为教程2里面有一个小bug, 让我着实纠结了好久
在./configure PHP的时候使用选项
--with-mysqli=mysqlnd
--with-mysql=mysqlnd
作用是使用PHP 团队自己写的mysql驱动:native driver ,但是在php.ini 中找不到配置这个东西的方法,一开始我以为这是自动的连上mysql, 不用在配置了,实际上连接了好几次都是connection error, file or directory not found.
就连官方文档都是:--with-mysql=MYSQL-DIR,
所以我决定重新编译PHP,把选项--with-mysqli=/usr/local/mysql --with-mysql=/usr/local/mysql ,让它指向mysql的安装目录,然后就可以自动生成msql.so ,在php.ini中就可以配置了。但事实上他并没有自动生成这个链接库。
然后我就找如何生成这个msql.so, 各种资料包括官方文档中生成的都是mysql.so 不是msql.so, 这俩差一个字母,但不是一个东西,没法手动编译生成msql.so !!!
在configure的时候一直出现这种问题:
configure: error: Cannot find libmysqlclient under /usr/local/mysql
Note that the MySQL client library is not bundled anymore
网上的解决方案:把/usr/lib64/mysql 或者/usr/local/mysql/lib 目录下的libmysqlclient.so 拷贝到/usr/lib/mysql 无效!!!
it's a nightmare, i'm freaking out
我的错误在于:一直以为PHP没有加载msql.so 就不能连接mysql ,实际上你用mysqlnd 编译的已经植入到PHP当中了,不用另外添加extension,
也就是说php.ini 中不用去管 ;extension=msql.so
在URL 栏中 访问phpinfo.php 这个页面, 如果出现这个部分
就说明你的php 与 mysql 已经连接成功了,若出现这种情况
就是Mysql 的数据库用户没有添加到系统用户中或者用户名密码错误,可以的话在命令行中输入 mysql -u mysql -p mysql 来测试某用户是否可以登陆Mysql数据库。
struggle 的过程是非常闹心的,但学到了挺多东西,反思一下更能提升不少:
1.解决问题的时候自己太着急了,出了错误并没有认真的查看php or nginx error.log 所提示的错误,导致浪费了很多时间,Remember: More haste, less speed. Please calm down.
2. 查找资料最好找官方文档,很多博客都是复制粘贴了好几遍的千篇一律,这些的来源都是官方的文档,另外一定要仔细研读给出的错误信息,这就像是一条异常链,展现给用户的并不是问题的本质,Remember: Seize the origin of problem.
【祝新闻联播 完】
欢迎高手们批评指正~ 分享推动社会进步!