这几天在Centos6.5环境下搭建服务器,php在项目中用来做接口服务器。因为以前没有搭建过,以前从事Linux c/c++开发,现在叫我搭建这个服务器,真心花了我好长时间,幸好最终成功部署,并测试成功。下面大概讲一下我的搭建流程和遇到的一些问题,希望遇到这些的问题的朋友,能够从我这里获取到一些帮助
我搭建的方式用了两种
1、用yum命令安装
安装mysql
yum install mysql mysql-server
chkconfig mysqld on ---设为开机自动启动
安装完成后,在window用NavicatPremium 连接并创建相关表,或者直接在centos使用命令创建并导入事先准备的sql脚本
Navicat Premium是个非常好用的一个工具,支持mysql,sqlite,Oracle,SQLServer等数据库
安装nginx
yum install nginx
service nginx start(stop|restart) ---启动(停止|重启)
chkconfig nginx on ---设为开机自动启动
安装php
yum install php
安装php组件
yum install php-mysql php-gd libjpeg*php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcryptphp-bcmath php-mhash libmcrypt libmcrypt-devel php-fpm openssl
/etc/rc.d/init.d/php-fpm start ---启动
chkconfig php-fpm start ---设为开机自动启动
修改nginx配置文件
cp /etc/nginx/nginx.conf /etc/nginx/nginx.confbak #备份原有配置文件
vi/etc/nginx/nginx.conf #编辑
user nginx nginx; #修改nginx运行账号为:nginx组的nginx用户
:wq! #保存退出
cp /etc/nginx/conf.d/default.conf/etc/nginx/conf.d/default.confbak #备份原有配置文件
vi /etc/nginx/conf.d/default.conf #编辑
index index.phpindex.html index.htm; #增加index.php
# pass thePHPscripts 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;
}
#取消FastCGIserver部分location的注释,并要注意fastcgi_param行的参数,改为$document_root$fastcgi_script_name,或者使用绝对路径
修改php配置文件
vi /etc/php.ini #编辑
date.timezone=PRC #在946行 把前面的分号去掉,改为date.timezone = PRC
vi/etc/php-fpm.d/www.conf #编辑
user = nginx #修改用户为nginx
group = nginx #修改组为nginx
注意:为你设置的主目录用户和用户组,默认安装的主目录为/usr/share/nginx/html/
安装成功验证测试:
在默认安装的主目录/usr/share/nginx/html/,创建一个简单的php文件
vi index.php #新建index.php文件
<?php
phpinfo();
?>
:wq! #保存
然后打开浏览器,输入你的服务器ip,如果出现关于phpinfo的相关信息,说明安装成功
2、下载源码安装
mysql我没有下载源码安装,而是直接使用yum install mysql 安装
(1)nginx源码安装
在安装之前,到网上下载pcre源码(pcre-8.36.zip),zlib源码(zlib-1.2.8.tar.gz),openssl源码(openssl-1.0.1j)
下载nginx,我这里的nginx版本为nginx-1.6.1.tar.gz
解压nginx-1.6.1.tar.gz并进入目录
./configure--prefix=/opt/nginx/ --with-http_ssl_module --with-http_stub_status_module--with-pcre=../pcre-8.36 --with-zlib=../zlib-1.2.8--with-openssl=../openssl-1.0.1j
说明:--with-pcre,--with-zlib,--with-openssl后面接的是源码目录
安装完成后,进入/opt/nginx目录,会生成“conf html logs sbin”
默认的主目录为”/opt/nginx/html“
安装完成后,你可以在你的浏览器中输入nginx服务器的ip地址,会打开“Welcome"等相关的网页,到目前为止,只支持html静态文件,如果你访问php文件是不可以访问的
(2)php源码安装
下载php,我这里的php版本为php-5.5.15.tar.gz
解压php-5.5.15.tar.gz并进入目录
./configure--prefix=/opt/php --with-config-file-path=/opt/php/etc --enable-fpm--with-fpm-user=sqy --with-fpm-group=sqy --with-mysql=mysqlnd--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gettext--enable-mbstring --with-iconv --with-mcrypt=/usr/local/lib --with-mhash--with-openssl -enable-soap --with-libxml-dir --with-png-dir=/usr/lib64--with-curl --enable-sockets --with-zlib --enable-zip --with-bz2
说明:--with-fpm-user=sqy --with-fpm-group=sqy
sqy为你自己的设置的主目录所在的用户和用户组
编译遇到问题:error: xml2-config not found.等相关字样,需要到网上下载相应的包,
(参考:http://www.cnblogs.com/alexqdh/archive/2012/11/20/2776017.html)
安装成功后,现在我们来配置文件,配置文件很重要,有时因为配置问题,导致服务不能正常运行
(3)配置nginx,php
在nginx配置文件(/opt/nginx/conf/nginx.conf)中修改如下部分
index index.php index.htmlindex.htm; #增加index.php
# pass the PHPscripts toFastCGI 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;
}
#取消FastCGIserver部分location的注释,并要注意fastcgi_param行的参数,改为$document_root$fastcgi_script_name,或者使用绝对路径
进入php安装后目录(/opt/php),拷贝/opt/php/etc/php-fpm.conf.default为/opt/php/etc/php-fpm.conf,/etc/php.ini为/opt/php/etc/php.ini
修改配置文件php-fpm.conf,查看user=你设置的在安装时,group=你设置的在安装时 ,我设置的为sqy,因为我设置的主目录在(/hom/sqy/myfile),现在我还没有设置我的主目录
修改配置文件php.ini,
data.timezone = PRC
设置完成后,重启php-fpm服务器
(4)测试是否能访问php文件
在nginx的html目录即(/opt/nginx/html),创建一个测试的php文件,test.php内容如下:
<?php
echo "I am test";
?>
在浏览器输入服务器ip,如果页面出现”I am test“,说明我们配置的php服务器是成功的,如果出现”No input file specified.“,解决方法如下:
打开/opt/php/etc/php.ini文件,将”;cgi.fix_pathinfo=1“ 修改为”cgi.fix_pathinfo=1“,保存,并重启php-fpm服务器
(5)在nginx配置文件中,加入自定义服务
server {
listen 8189;
root /home/sqy/myfiles/wwwroot;
charset utf-8;
if (!-e$request_filename) {
rewrite ^.*$ /index.php last;
}
# listen somename:8080;
# server_name somename alias another.alias;
location ~\.php$ {
#root html;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME $document_root$fastcgi_script_name;
includefastcgi_params;
}
}
添加完成后,重启nginx服务器,在自定义主目录/home/sqy/myfiles/wwwroot创建一个测试的php文件,并在浏览器输入带8189端口的地址访问该文件
如果还是出现”No input file specified.“,但是80端口的主目录(/opt/nginx/html)下的文件却可以正常访问,自定义的端口8189主目录下的却还是”No input file specified.“,
打开配置文件”/opt/php/etc/php.ini“,查看”open_basedir =“是否被启用,如果启用,注释掉”;open_basedir =“,现在再重新访问,应该可以成功。
当nginx服务器可以正常解析静态html文件,而不能解析php文件时,可以查看nginx的输出错误日志(/opt/nginx/logs/error.log),看报什么错,然后再进行相应的解决
如果在nginx启动过程中,遇到类似”lock“的字样,是因为nginx的唯一性判断,如果我们用service nginx start启动程序,但是通过ps命令查看该进程的pid,并用kill命令杀死该进程,那么你在用service nginx start将不能正常启动,你可以将记录nginx的进程pid文件删除,并重新启动
(6)将nginx和php-fpm设置为服务程序
我们知道,在linux中,通过service XXX start 可以启动名为xxx的服务程序,因为我们采用源码安装/etc/init.d/目录下可能没有nginx和php-fpm,现在我将我的nginx和php-fpm脚本设置为服务程序的脚本如下,
nginx
#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxyserver.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/opt/nginx/sbin/nginx
nginx_config=/opt/nginx/conf/nginx.conf
nginx_pid=/opt/nginx/logs/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx/opt/nginx/logs/nginx.pid
}
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog{start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
php-fpm
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
prefix=/opt/php
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm.conf
php_fpm_PID=${prefix}/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF --pid$php_fpm_PID"
wait_for_pid () {
try=0
while test$try -lt 35 ; do
case"$1" in
'created')
if[ -f "$2" ] ; then
try=''
break
fi
;;
'removed')
if[ ! -f "$2" ] ; then
try=''
break
fi
;;
esac
echo-n .
try=`expr$try + 1`
sleep1
done
}
case "$1" in
start)
echo-n "Starting php-fpm "
$php_fpm_BIN--daemonize $php_opts
if ["$?" != 0 ] ; then
echo" failed"
exit1
fi
wait_for_pidcreated $php_fpm_PID
if [-n "$try" ] ; then
echo" failed"
exit1
else
echo" done"
fi
;;
stop)
echo-n "Gracefully shutting down php-fpm "
if [! -r $php_fpm_PID ] ; then
echo"warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill-QUIT `cat $php_fpm_PID`
wait_for_pidremoved $php_fpm_PID
if [-n "$try" ] ; then
echo" failed. Use force-quit"
exit1
else
echo" done"
fi
;;
status)
if [! -r $php_fpm_PID ] ; then
echo"php-fpm is stopped"
exit0
fi
PID=`cat$php_fpm_PID`
if ps-p $PID | grep -q $PID; then
echo"php-fpm (pid $PID) is running..."
else
echo"php-fpm dead but pid file exists"
fi
;;
force-quit)
echo-n "Terminating php-fpm "
if [! -r $php_fpm_PID ] ; then
echo"warning, no pid file found - php-fpm is not running ?"
exit1
fi
kill-TERM `cat $php_fpm_PID`
wait_for_pidremoved $php_fpm_PID
if [-n "$try" ] ; then
echo" failed"
exit1
else
echo" done"
fi
;;
restart)
$0stop
$0start
;;
reload)
echo-n "Reload service php-fpm "
if [! -r $php_fpm_PID ] ; then
echo"warning, no pid file found - php-fpm is not running ?"
exit1
fi
kill-USR2 `cat $php_fpm_PID`
echo" done"
;;
*)
echo"Usage: $0 {start|stop|force-quit|restart|reload|status}"
exit1
;;
esac
现在我们先将之前直接启动的进程,用kill命令杀死,通过service nginx start,servicephp-fpm start来启动我们部署的服务程序
(7)php配置访问mongo数据库的方法
下载mongo-php-driver-master.zip,unzip命令解压该文件,查看README.md文件,执行以下命令
phpize
make
make install
如果执行phpize命令没有反应,可以通过yum命令安装php-devel或者下载php-devel源码文件(php-devel-5.3.3-26.el6.x86_64.rpm)进行安装
安装成功后,用find / -name "mongo.so"命令查看文件的安装位置,将mongo.so文件拷贝到”/opt/php/lib/php/extensions/no-debug-non-zts-20121212/“,
并修改配置文件”/opt/php/etc/php.ini“,加入”extension=mongo.so“,并重启php-fpm服务器,现在就可以在php代码中访问mongo数据库了