文章目录
1 简介
一种常用的web服务环境组合
linux,nginx,mysql,php(手机端是tomcat)
2 工作流程
用户通过http请求访问web服务器,如果是静态资源,则由nginx解释返回给用户;若是动态请求(.php结尾),那么nginx就会把它通过fastcgi接口,发送给php引擎服务进行解析;若该动态请求要求读取数据库数据,那么PHP就会向后请求MySQL数据库,读取需要的数据,最终通过nginx服务把获取的数据返回给用户。
3 配置步骤
3.1 配置nginx服务
3.2 二进制方式安装MySQL
#解压数据库文件
tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -s mysql-5.5.32-linux2.6-x86_64 mysql
#修改配置文件
cd /usr/local/mysql
/bin/cp support-files/my-small.cnf /etc/my.cnf
#初始化MySQL数据库文件
useradd -s /sbin/nologin -M mysql
mkdir -p /usr/local/myql/data
chown -R mysql /usr/local/mysql
yum -y install libaio
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
#初始化成功会有两个OK的字样,并且在数据目录下生成一些数据库运行的必需基本文件
#配置并启动MySQL数据库
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
/etc/init.d/mysqld start
ss -antup | grep mysql
#加入开机自启动
chkconfig --add mysqld
#创建命令软连接
ln -s /usr/local/mysql/bin/* /usr/local/bin
#给root用户设置密码
mysqladmin -u root password '123123'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
3.3 Fastcgi介绍
- 简介
一种可伸缩,高速地在http服务器和动态脚本语言间通信的接口,主要优点是把动态语言和http服务器分离出来
fastcgi客户端:fastcgi_pass(nginx集成了fastcgi的客户端)
服务端:php-fpm(php集成了服务端)
fastcgi接口软件采用的是C/S架构,在这里,client相当于nginx,它接收nginx发送过来的http请求,并将其解析为fastcgi数据包(这种包的格式更为严谨,因此大小也比http数据包大),发送到fastcgi服务端,通过socket进程(监听端口默认9000)发送到php服务,向后方获取数据
3.4 PHP服务的安装和准备
3.4.1 准备工作
检查nginx和MySQL的安装和启动
ls -ld /usr/local/nginx
ls -ld /usr/local/mysql
ss -antup | egrep "80|3306"
测试nginx
wget 127.0.0.1
测试登录mysql
mysql -uroot -p123123
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.4.2 安装PHP所需的lib库
yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
yum -y install freetype-devel libpng gd libcurl-devel libxslt-devel
#安装后最好检查一下,命令1安装4个包应该仅缺少libiconv-devel包,默认yum源没有此包,需要编译安装
rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
#检查结果
zlib-devel-1.2.3-29.el6.x86_64
libxml2-devel-2.7.6-14.el6.x86_64
libjpeg-turbo-devel-1.2.1-1.el6.x86_64
rpm -qa freetype-devel libpng-devel gd libcurl-devel libxslt-devel
#检查结果
freetype-devel-2.3.11-14.el6_3.1.x86_64
libpng-devel-1.2.49-1.el6_2.x86_64
libcurl-devel-7.19.7-37.el6_4.x86_64
libxslt-devel-1.1.26-2.el6_3.1.x86_64
gd-2.0.35-11.el6.x86_64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
3.4.3 编译安装libiconv-devel
tar xf libiconv-1.14.tar.gz -C /usr/src
cd /usr/src/libiconv-1.14
./configure --prefix=/usr/local/libiconv && make && make install
- 1
- 2
- 3
- CentOS 7.5版本在执行make环节时,可能出现
./stdio.h:1010:2: error: invalid preprocessing directive #_GL_WARN_ON_USE
#_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
^
make[2]: *** [progname.o] Error 1
make[2]: Leaving directory `/usr/src/libiconv-1.14/srclib'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/src/libiconv-1.14/srclib'
make: *** [all] Error 2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 解决办法是
将srclib/stdio.in.h文件中,698行删除
,重新make
3.4.4 安装其他的库和加密扩展库
使用rpm安装,或者云yum安装,34存在顺序关系,这里没指定版本,使用rpm安装需要指定完整的软件包名
rpm -ivh libmcrypt
rpm -ivh libmcrypt-devel
rpm -ivh mhash
rpm -ivh mcrypt
- 1
- 2
- 3
- 4
3.4 解压,预配置PHP(Fastcgi方式)服务
tar xf php-5.3.28.tar.gz -C /usr/src
cd /usr/src/php-5.3.28
./configure --prefix=/usr/local/php5.3.28 --with-mysql=/usr/local/mysql --with-iconv-dir=ocal/mysql --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-zend-multibyte --enable-static --with-xsl --with-fpm-user=nginx --with-fpm-group=nginx --enable-ftp
#出现thank you for using php则为正确
- 1
- 2
- 3
- 4
- 部分参数说明:
指定安装目录
–prefix=/usr/local/php5.2.28指定mysql的安装路径,因为需要安装php所需的mysql相关内容 如果本地没有mysql,那么这个参数可用--with-mysql=mysqlnd代替,这是php自带的连接mysql的客户端工具
(分离式部署需要用到–with-mysql=mysqlnd)
–with-mysql=/usr/local/mysql指定php-fpm进程管理的用户和组,最好和nginx用户统一
–with-fpm-user=nginx
–with-fpm-group=nginx表示激活php-fpm方式服务,以fastcgi方式运行php
(php与nginx分离部署时,需要在php服务器上,也创建nginx的程序用户,保证两台主机上的程序用户相同,否则无法启动php-fpm)
3.5 编译安装PHP
cd /usr/src/php-5.3.28
ln -s /usr/local/lib/libmysqlclient.so.18 /usr/lib64/
touch ext/phar/phar.phar
- 1
- 2
- 3
(需要注意的是,分离式部署不需要上面这一步,预配置完成后,直接编译)
make
#正确提示为Don't forget to run 'make test'.,最后完成编译
make install
- 1
- 2
- 3
3.6 修改配置文件
#设置软连接以方便访问
ln -s /usr/local/php5.3.28 /usr/local/php
cd /usr/src/php-5.3.28/
ls php.ini*
#有两个模板配置文件,一个生产用,一个测试用,我们用生产配置文件,拷贝到php默认目录并更名,这是php解析fastcgi服务的配置文件
cp php.ini-production /usr/local/php/lib/php.ini
#配置php(fastcgi方式)的配置文件php-fpm.conf,这是fastcgi服务端的socket进程配置文件
cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
(分离式部署式,需要修改配置文件151行,监听IP改为php服务器的IP,否则不能收到远程主机发送过来的fashcgi数据包(一体化监听127.0.0.1)
#启动php-fpm监听进程并检查端口占用,暂时用默认配置,以后再进行优化
/usr/local/php/sbin/php-fpm
lsof -i:9000
- 1
- 2
- 3
3.7 配置nginx支持php程序请求访问
修改配置文件,增加动态location模块(虚拟主机为blog.yunjisuan.com)
location ~ .*.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
- 1
- 2
- 3
- 4
- 5
- 6
检查nginx配置文件并重启nginx服务
测试php解析请求是否OK
(分离式部署,fastcgi推送IP改为php主机IP,fastcgi可以通过推送给不同服务器池,来处理不同的动态业务,类似于反向代理)
#创建php用于测试的动态网页文件
cd /usr/local/nginx/html/blog
echo "<?php phpinfo(); ?>" > test_info.php
- 1
- 2
- 3
打开浏览器测试http://blog.yunjisuan.com/test_info.php 测试正常,进行下一步
3.8 针对nginx访问php,测试php连接MySQL
cd /usr/local/nginx/html/blog/
vim test_mysql.php
#内容为
<?php
//$link_id=mysql_connect('主机名','用户','密码');
$link_id=mysql_connect('localhost','root','123123');
if($link_id){
echo "mysql successful by joe";
}else{
echo mysql_error();
}
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
在浏览器中测试访问http://blog.yunjisuan.com/test_mysql.php 成功则会出现已设定的提示语
(分离式部署时,测试登录mysql的用户需要能远程登录mysql)
3.9 有动态主页时需要注意的问题
-
当nginx默认location模块指定主页文件为index.php时,当访问主页,nginx会去网页目录下找index.php页面,若页面存在,则触发动态location模块,通过fastcgi转发请求给php去找动态主页,若页面不存在,由于安全机制,不会返回404,而返回403权限拒绝
-
所以,分离式部署情况时,要保证两台主机都有网页目录,且属主为nginx程序用户,网页目录下的文件都相同,且都存在动态主页文件,而静态数据,upload和static目录,都需要挂载到NFS存储上
4. 部署个人blog服务
4.1 mysql数据库配置准备
1.登录mysql数据库创建专用的库wordpress,用于存放blog数据
2.创建专用wordpress blog管理用户wordpress用户权限为对库wordpress有all权限, 登录IP设置为php服务同主机(此处为localhost)
4.2 nginx及php环境配置准备
-
在nginx配置文件中,默认localhost模块t添加一个首页文件index.php
index index.php index.html index.htm;
-
将blog服务相关文件解压至blog网页目录中
tar xf wordpress-4.7.4-zh_CN.tar.gzz -C /usr/local/nginx/html/blog/
cd /usr/local/nginx/html/blog -
删除无用文件,保证目录下只有blog服务的网页文件,并授权nginx程序用户
rm -f index.html test_info.php test_mysql.php
mv wordpress/* .
chown -R nginx /usr/local/nginx/html/blog/
nginx -s reload
- 1
- 2
- 3
- 4
-
打开浏览器开始安装wordpress个人博客
需要准备的内容有:
前文创建的mysql库wordpress
专用用户wordpres及密码
允许访问的数据库主机IP,这里是LNMP一体环境,所以是localhost
表的前缀,自定义 -
然后进行个人信息注册
-
登录后实现wordpress博客程序URL静态化
在wordpress后台依次点击
设置——固定链接——自定义结构
然后输入代码/archives/%post_id%.html
然后,修改nginx配置文件,在默认的location模块中加入以下内容:
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
最后重新启动nginx服务,这样访问blog时就成功实现URL静态化