Nginx+PHP+MySql, both on Windows & Linux

来源:互联网 发布:淘宝如何设置最低折扣 编辑:程序博客网 时间:2024/05/16 16:55

    搭建一个陌生的环境是一个非常 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改成这个,不用加'/'


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 版 环境搭建

     服务器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.


【祝新闻联播 完】

欢迎高手们批评指正~ 分享推动社会进步!

0 0
原创粉丝点击