LNMP 工作流程;
用户通过浏览器请求nginx web服务,如果是静态资源,nginx直接解析返回给用户。
如果是动态请求(.php),nginx 通过FastCGI接口发送给PHP引擎服务(FastCGI进程php-fpm)解析,
请求要求读取数据库,PHP会请求mysql据库库,以读取需求的数据,并最终通过nginx把获取的数据
返回给用户。
1.安装配置mysql:
1.创建mysql用户。 #useradd -s /sbin/nologin -M
2.采用二进制方式安装mysql
(mysql-5.5.53-linux2.6-x86_64.tar.gz二进制名称比源码包多了内核和CPU架构)
(1)解压到指定路径,建立软链接
# tar zxvf mysql-5.5.53-linux2.6-x86_64.tar.gz
# mv mysql-5.5.53-linux2.6-x86_64 /application/mysql-5.5.53
# ln -s /application/mysql-5.5.53/ /application/mysql
3.初始化mysql配置文件my.cnf
# mv /etc/my.cnf /etc/my.cnf.bak
# /bin/cp support-files/my-small.cnf /etc/my.cnf
# diff /etc/my.cnf support-files/my-small.cnf
4.初始化mysql数据库文件:
# mkdir -p /application/mysql/data
# chown -R /application/mysql/
# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql
一般出现:
OK
Filling help tables...
170201 16:47:32 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
170201 16:47:32 [Note] /application/mysql/bin/mysqld (mysqld 5.5.53) starting as process 19530 ...
OK
2个OK字段代表初始化成功。
5.配置并启动mysql数据库。
# cp ./support-files/mysql.server /etc/init.d/mysqld
# sed -i "s#/usr/local/mysql#/application/mysql#g" /etc/init.d/mysqld /application/mysql/bin/mysqld_safe
6.启动数据库并检查启动情况:
# service mysql start
查看; # netstat -lnutp | grep msyqld
# lsof -i:3306
# ps -ef | grep mysqld
以上三种方法均可。(原理就是通过端口号或路径查看mysql的启动状态)
如果出现问题可以查看 mysql/data/主机名.err (mysql相对应的日志)
7.开机自动启动mysql 并将mysql写入系统变量方便应用
# chkconfig mysqld on
# echo ' export PATH=/application/mysql/bin:$PATH' >> /etc/profile
# source /etc/profile
# which mysqld
/application/mysql/bin/mysqld
8.正式进入数据库:
# mysql
mysql>
如果出现:Access denied for user 这样的字样。
因为是第一次登录数据库,默认就是root用户无密码状态。排除了mysql启动问题。
最有可能的原因是数据库初始化出现问题:一般清空data 目录内容。重新初始化。
检查mysql目录权限,或者是主机名对应ip解析是否正确。
9.加固mysql
1.为mysql设置密码
# mysqladmin -uroot password 'swallow'
2.清空无用的mysql用户和库。
mysql> drop database test;
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | swallow |
| root | swallow |
+------+-----------+
mysql> drop user 'root'@'::1';
(使用drop命令 格式是 drop tablesname 'uservalue'@'对应的hostvalue')
如果遇到大写字符,有时候drop不太好用可以使用 delete
mysql> delete from mysql.user where user='root' and host='swallow';
(delete from databasename.tablesname where user='uservalue' and host='hostname')
一般优化后:
mysql> select user,host from user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
FastCGI简介;
CGI(common gateway interface 通用网关接口)是http服务器与其它机器上的程序服务通信交流的一种工具。
缺点是:性能差。每次连接时都需要重新启动解析器。
FastCGI是一个可伸缩地,高速地在http服务器和动态脚本语言间通信的接口(linux下,FastCGI接口就是一个socket,
这个socket可以是socket文件也可以是IPsocket)优点:就是把动态语言和http服务器分离开来。
FastCGI主要特点:
1.给http服务器和动态语言(PHP)间通信提供接口
2.把动态语言解析和web服务器分离
3.FastCGI接口方式采用C/S结构,分为客户端(web服务器)和服务器端(动态语言解析服务器)
nginx下FastCGI运行的原理:
nginx(fastcgi_pass接口)<=FastCGI=> php-fpm <=wrapper=> php解析器 <=Access database=>mysql
简诉为:nginx遇到动态程序。通过fastcgi_past 和FastCGI相连,PHP端通过 php-fpm 生成的wrapper 连接到PHP的解析器。(
如果有必要PHP连接mysql)解析完毕后返回给nginx。这样操作:把动态语言的解析和nginx分离,nginx专门处理静态请求和
向后转发动态请求。PHP/PHP-FPM解析PHP动态请求。
2.nginx下PHP的安装:
首先确定:nginx和mysql正常使用。
#lsof -i:80 ;lsof -i:3306
1.检查PHP所需要的lib库(PHP脚本语言的的强大也是需要大量库的支持)
企业应用需要 zlib-devel libxml2-devel libjpeg-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel 这些库的支持
其中 libjpeg-turbo-devel 是libjpeg-devel 的早期名称
这里启用yum安装:
# yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel -y
# yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel -y
其中 libiconv ,需要手动编译。(yum没有这个包)
# wget https://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz --no-check-certificate
./configure --prefix=/usr/local/libiconv
make
make install
才外还需要几个涉及算法和加密的库文件:libmcrypt mhash mcrypt
这3个库需要epel的第三方yum源。下面构建这个yum 源:(利用阿里的镜像)
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
# yum install libmcrypt mhash mcrypt -y
源码安装一般包括3个部分:./configure 分析系统环境(根据开启的支持模块功能去测试库文件是否齐全)
make (编译) make install (安装)
2.php 源码包下载地址:
http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror
解压,配置安装:
# ./configure \
--prefix=/application/php5.5.38 \
--with-mysql=/application/mysql \
--with-pdo-mysql=mysqlnd \
--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-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--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-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp \
--enable-opcache=no
3.编译安装:
/data/php-5.5.38/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
出现报错。库文件缺少支持。
# ln -s /application/mysql/lib/libmysqlclient.so.18 /usr/lib64/
chmod: cannot access `ext/phar/phar.phar': No such file or directory
make: [ext/phar/phar.phar] Error 1 (ignored)
还有一个可以忽略的错误;找不到 这个文件: # touch ext/phar/phar.phar
# make
Build complete.
Don't forget to run 'make test'.
至此,编译通过 执行 # make install
4.配置PHP的引擎文件php.ini 和PHP服务(FastCGI方式)的配置文件 php-fpm.conf
# ln -s /application/php-5.5.38 /application/php
# cp php.ini-production /application/php/lib/php.ini
# cd /application/php/etc/; cp php-fpm.conf.default php-fpm.conf
最后启动PHP(FastCGI模式)
# /application/php/sbin/php-fpm
[root@swallow etc]# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 22274 root 7u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 22275 nginx 0u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 22276 nginx 0u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
3.配置nginx支持PHP程序访问请求:
这里以blog配置为例:在 extra/blog.conf中添加
location ~ .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
重启nginx服务
新建测试文件测试:
# cd html/blog/ ; echo "<?php phpinfo() ?>" >test_info.php
测试与mysql的连通性:
# vim test_mysql.php
<?php
$link_id=mysql_connect('localhost','root','swallow') or mysql_error();
if ($link_id){
echo "mysql successful by swallow\n";
}else{
echo mysql_error();
}
?>
# curl blog.swallow.com/test_mysql.php
mysql successful by swallow
php.ini 几个重要参数:(前面数字为行号)
363 expose_php = On #开启表示显示PHP版本信息
466 display_errors = Off #错误信息控制,测试地时候开启
487 log_errors = On #开启日志
803 allow_url_fopen = On #开启远程打开(禁止)
相关业务场景:
372 max_execution_time = 30 # 单个脚本运行最大时间。单位为秒
382 max_input_time = 60 # 单个脚本等待输入的最长时间
393 memory_limit = 128M #单个脚本最大使用内存
792 upload_max_filesize = 2M #上传文件最大许可
795 max_file_uploads = 20 #可以通过请求的最大文件数
用户通过浏览器请求nginx web服务,如果是静态资源,nginx直接解析返回给用户。
如果是动态请求(.php),nginx 通过FastCGI接口发送给PHP引擎服务(FastCGI进程php-fpm)解析,
请求要求读取数据库,PHP会请求mysql据库库,以读取需求的数据,并最终通过nginx把获取的数据
返回给用户。
1.安装配置mysql:
1.创建mysql用户。 #useradd -s /sbin/nologin -M
2.采用二进制方式安装mysql
(mysql-5.5.53-linux2.6-x86_64.tar.gz二进制名称比源码包多了内核和CPU架构)
(1)解压到指定路径,建立软链接
# tar zxvf mysql-5.5.53-linux2.6-x86_64.tar.gz
# mv mysql-5.5.53-linux2.6-x86_64 /application/mysql-5.5.53
# ln -s /application/mysql-5.5.53/ /application/mysql
3.初始化mysql配置文件my.cnf
# mv /etc/my.cnf /etc/my.cnf.bak
# /bin/cp support-files/my-small.cnf /etc/my.cnf
# diff /etc/my.cnf support-files/my-small.cnf
4.初始化mysql数据库文件:
# mkdir -p /application/mysql/data
# chown -R /application/mysql/
# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql
一般出现:
OK
Filling help tables...
170201 16:47:32 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
170201 16:47:32 [Note] /application/mysql/bin/mysqld (mysqld 5.5.53) starting as process 19530 ...
OK
2个OK字段代表初始化成功。
5.配置并启动mysql数据库。
# cp ./support-files/mysql.server /etc/init.d/mysqld
# sed -i "s#/usr/local/mysql#/application/mysql#g" /etc/init.d/mysqld /application/mysql/bin/mysqld_safe
6.启动数据库并检查启动情况:
# service mysql start
查看; # netstat -lnutp | grep msyqld
# lsof -i:3306
# ps -ef | grep mysqld
以上三种方法均可。(原理就是通过端口号或路径查看mysql的启动状态)
如果出现问题可以查看 mysql/data/主机名.err (mysql相对应的日志)
7.开机自动启动mysql 并将mysql写入系统变量方便应用
# chkconfig mysqld on
# echo ' export PATH=/application/mysql/bin:$PATH' >> /etc/profile
# source /etc/profile
# which mysqld
/application/mysql/bin/mysqld
8.正式进入数据库:
# mysql
mysql>
如果出现:Access denied for user 这样的字样。
因为是第一次登录数据库,默认就是root用户无密码状态。排除了mysql启动问题。
最有可能的原因是数据库初始化出现问题:一般清空data 目录内容。重新初始化。
检查mysql目录权限,或者是主机名对应ip解析是否正确。
9.加固mysql
1.为mysql设置密码
# mysqladmin -uroot password 'swallow'
2.清空无用的mysql用户和库。
mysql> drop database test;
mysql> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | swallow |
| root | swallow |
+------+-----------+
mysql> drop user 'root'@'::1';
(使用drop命令 格式是 drop tablesname 'uservalue'@'对应的hostvalue')
如果遇到大写字符,有时候drop不太好用可以使用 delete
mysql> delete from mysql.user where user='root' and host='swallow';
(delete from databasename.tablesname where user='uservalue' and host='hostname')
一般优化后:
mysql> select user,host from user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
FastCGI简介;
CGI(common gateway interface 通用网关接口)是http服务器与其它机器上的程序服务通信交流的一种工具。
缺点是:性能差。每次连接时都需要重新启动解析器。
FastCGI是一个可伸缩地,高速地在http服务器和动态脚本语言间通信的接口(linux下,FastCGI接口就是一个socket,
这个socket可以是socket文件也可以是IPsocket)优点:就是把动态语言和http服务器分离开来。
FastCGI主要特点:
1.给http服务器和动态语言(PHP)间通信提供接口
2.把动态语言解析和web服务器分离
3.FastCGI接口方式采用C/S结构,分为客户端(web服务器)和服务器端(动态语言解析服务器)
nginx下FastCGI运行的原理:
nginx(fastcgi_pass接口)<=FastCGI=> php-fpm <=wrapper=> php解析器 <=Access database=>mysql
简诉为:nginx遇到动态程序。通过fastcgi_past 和FastCGI相连,PHP端通过 php-fpm 生成的wrapper 连接到PHP的解析器。(
如果有必要PHP连接mysql)解析完毕后返回给nginx。这样操作:把动态语言的解析和nginx分离,nginx专门处理静态请求和
向后转发动态请求。PHP/PHP-FPM解析PHP动态请求。
2.nginx下PHP的安装:
首先确定:nginx和mysql正常使用。
#lsof -i:80 ;lsof -i:3306
1.检查PHP所需要的lib库(PHP脚本语言的的强大也是需要大量库的支持)
企业应用需要 zlib-devel libxml2-devel libjpeg-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel
freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel 这些库的支持
其中 libjpeg-turbo-devel 是libjpeg-devel 的早期名称
这里启用yum安装:
# yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel -y
# yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel -y
其中 libiconv ,需要手动编译。(yum没有这个包)
# wget https://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz --no-check-certificate
./configure --prefix=/usr/local/libiconv
make
make install
才外还需要几个涉及算法和加密的库文件:libmcrypt mhash mcrypt
这3个库需要epel的第三方yum源。下面构建这个yum 源:(利用阿里的镜像)
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
# yum install libmcrypt mhash mcrypt -y
源码安装一般包括3个部分:./configure 分析系统环境(根据开启的支持模块功能去测试库文件是否齐全)
make (编译) make install (安装)
2.php 源码包下载地址:
http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror
解压,配置安装:
# ./configure \
--prefix=/application/php5.5.38 \
--with-mysql=/application/mysql \
--with-pdo-mysql=mysqlnd \
--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-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--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-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp \
--enable-opcache=no
3.编译安装:
/data/php-5.5.38/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
出现报错。库文件缺少支持。
# ln -s /application/mysql/lib/libmysqlclient.so.18 /usr/lib64/
chmod: cannot access `ext/phar/phar.phar': No such file or directory
make: [ext/phar/phar.phar] Error 1 (ignored)
还有一个可以忽略的错误;找不到 这个文件: # touch ext/phar/phar.phar
# make
Build complete.
Don't forget to run 'make test'.
至此,编译通过 执行 # make install
4.配置PHP的引擎文件php.ini 和PHP服务(FastCGI方式)的配置文件 php-fpm.conf
# ln -s /application/php-5.5.38 /application/php
# cp php.ini-production /application/php/lib/php.ini
# cd /application/php/etc/; cp php-fpm.conf.default php-fpm.conf
最后启动PHP(FastCGI模式)
# /application/php/sbin/php-fpm
[root@swallow etc]# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 22274 root 7u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 22275 nginx 0u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 22276 nginx 0u IPv4 316220 0t0 TCP localhost:cslistener (LISTEN)
3.配置nginx支持PHP程序访问请求:
这里以blog配置为例:在 extra/blog.conf中添加
location ~ .*\.(php|php5)?$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
重启nginx服务
新建测试文件测试:
# cd html/blog/ ; echo "<?php phpinfo() ?>" >test_info.php
测试与mysql的连通性:
# vim test_mysql.php
<?php
$link_id=mysql_connect('localhost','root','swallow') or mysql_error();
if ($link_id){
echo "mysql successful by swallow\n";
}else{
echo mysql_error();
}
?>
# curl blog.swallow.com/test_mysql.php
mysql successful by swallow
php.ini 几个重要参数:(前面数字为行号)
363 expose_php = On #开启表示显示PHP版本信息
466 display_errors = Off #错误信息控制,测试地时候开启
487 log_errors = On #开启日志
803 allow_url_fopen = On #开启远程打开(禁止)
相关业务场景:
372 max_execution_time = 30 # 单个脚本运行最大时间。单位为秒
382 max_input_time = 60 # 单个脚本等待输入的最长时间
393 memory_limit = 128M #单个脚本最大使用内存
792 upload_max_filesize = 2M #上传文件最大许可
795 max_file_uploads = 20 #可以通过请求的最大文件数
本文转自 swallow_zys 51CTO博客,原文链接:http://blog.51cto.com/12042068/1894561,如需转载请自行联系原作者