LNMP:指的是Linux、nginx、mysql(或者mariadb)、php。是目前最常用最经典的web服务环境组合之一,除lnmp外,还有lamp。
lnmp工作流程:
用户通过浏览器请求nginx web服务:
如果请求的是静态资源,则由nginx解析返回给用户;
如果是动态请求(.php),那么nginx就会把它通过FastCGI接口(Fast Common Gateway Interface)发送给PHP引擎服务(FastCGI进程php-fpm)进程解析,如果这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL(或者MariaDB)数据库,以读取需要的数据,并最终通过nginx服务把获取的数据返回给用户。
Nginx FastCGI运行原理
nginx不支持对外部动态程序的直接调用或解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux中是socket,为了调用CGI程序,还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定的socket上,比如端口或者文件socket。
当nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本来读取返回的数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给nginx,最后nginx将返回的数据发送给客户端。
FastCGI主要优点:
把动态语言和HTTP服务器分离出来,使nginx专门处理静态请求及向后转发的动态请求,而PHP/PHP-FPM服务器则专门解析PHP动态请求。
为了测试方便,全部机子清空防火墙规则或者关闭防火墙。
LNMP:Linux+Nginx+Mariadb(Mysql)+PHP
nginx: 192.168.10.201【RHEL7.0 主机名:node1】
mariadb:192.168.10.202【RHEL7.3 主机名:node2】
php: 192.168.10.203【RHEL7.3 主机名:node3】
一、编译安装nginx(node1)
1、下载nginx
http://nginx.org/download/nginx-1.12.2.tar.gz
2、创建nginx组和用户
[root@node1 ~]# groupadd -r -g 300 nginx
[root@node1 ~]# useradd -r -g 300 -u 300 -s /sbin/nologin nginx
3、创建存放nginx日志目录
[root@node1 ~]# mkdir /mydata/logs/nginx/ -p
4、安装各种依赖包
[root@node1 ~]# yum groupinstall "Development Tools" -y
[root@node1 ~]#yum install gd-devel openssl openssl-devel pcre-devel -y
5、解压安装nginx-1.12.2.tar.gz
[root@node1 ~]# tar xf nginx-1.12.2.tar.gz
[root@node1 ~]# cd nginx-1.12.2/
[root@node1 nginx-1.12.2]# ./configure
–prefix=/usr/local/nginx
–user=nginx
–group=nginx
–http-log-path=/mydata/logs/nginx/access.log
–error-log-path=/mydata/logs/nginx/error.log
–with-http_ssl_module
–with-http_realip_module
–with-http_flv_module
–with-http_mp4_module
–with-http_gunzip_module
–with-http_gzip_static_module
–with-http_image_filter_module
–with-http_stub_status_module
–with-debug
–lock-path=/var/lock/nginx.lock
–http-client-body-temp-path=/var/tmp/nginx/client
–http-proxy-temp-path=/var/tmp/nginx/proxy
–http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
–http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
[root@node1 nginx-1.12.2]# make && make install
6、编写nginx服务脚本
[root@node1 nginx-1.12.2]# vim /etc/rc.d/init.d/nginx
#!/bin/bash
# nginx – this script starts and stops the nginx daemon
# chkconfig: – 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*–user=([^ ]*).*/1/g' -`
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
#configtest || return $?
stop
sleep 1
start
}
reload() {
#configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
8、将nginx添加到系统服务
[root@node1 nginx-1.12.2]# chmod 755 /etc/rc.d/init.d/nginx
[root@node1 nginx-1.12.2]# chkconfig –add nginx
9、启动nginx服务
[root@node1 nginx-1.12.2]# systemctl start nginx
浏览器打开:192.168.10.201
OK。。。 nginx已经编译安装成功。
二、编译安装mariadb(node2)
1、安装依赖包
[root@node2 ~]#yum -y install perl perl-devel
2、下载mariadb5.5.57,这里使用的是二进制安装包
http://mirrors.neusoft.edu.cn/mariadb/mariadb-5.5.57/source/mariadb-5.5.57.tar.gz
在官网中:源码安装包:mariadb-5.5.57.tar.gz,二进制安装包:mariadb-5.5.57-linux-x86_64.tar.gz,这里使用的是非官网的。
官网下载地址:https://downloads.mariadb.org/mariadb/5.5.57/
3、创建数据库数据存放目录
[root@node2 ~]# mkdir /mydata/data -pv
[root@node2 ~]# chown -R mysql.mysql /mydata/data/
4、创建mysql用户和组
[root@node2 ~]# groupadd -r -g 306 mysql
[root@node2 ~]# useradd -r -g 306 -u 306 -s /sbin/nologin mysql
5、安装maraidb
5.1解压maradb到/usr/local目录创建mysql连接
[root@node2 ~]# tar xf mariadb-5.5.57.tar.gz -C /usr/local/
[root@node2 ~]# cd /usr/local/
[root@node2 local]# ln -sv mariadb-5.5.57/ mysql
5.2修改mysql目录中全部文件的属主属组
[root@node2 local]# cd mysql/
[root@node2 mysql]# chown -R root.mysql ./*
5.4数据库初始化
[root@node2 mysql]# scripts/mysql_install_db –user=mysql –datadir=/mydata/data/
6、数据库配置文件
将support-files/my-large.cnf文件到/etc/mysql,名字为my.cnf
[root@node2 mysql]# mkdir /etc/mysql
[root@node2 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
7、修改my.cnf配置文件
[root@node2 mysql]# vim /etc/mysql/my.cnf
添加以下内容:
datadir = /mydata/data
innodb_file_per = on
skip_name_resolve = on
8、配置服务脚本
将support-files/mysql.server复制到/etc/rc.d/init.d/目录,命名为mysqld
[root@node2 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
9、新建/var/log/mysqld.log文件
[root@node2 mysql]# touch /var/log/mysqld.log
[root@node2 mysql]# chown mysql.mysql /var/log/mysqld.log
10.、将mysqld添加到系统服务
[root@node2 mysql]# chkconfig –add mysqld
11、修改环境变量
[root@node2 mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@node2 mysql]# source /etc/profile.d/mysql.sh
12、启动mysqld服务
[root@node2 mysql]# systemctl start mysqld
13、为root用户授权
在实战中root用户不能远程登录,可以授权普通用户远程登录。
[root@node2 mysql]# mysql
MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
MariaDB [(none)]> FLUSH PRIVILEGES;
在node1上连接数据库:
[root@node1 ~]# mysql -uroot -h192.168.10.202 -p123456
OK。。。maraidb数据库安装成功。
三、编译安装php(node3)
1、安装相关依赖包
[root@node3 ~]# yum -y install libxml2-devel bzip2-devel libcurl-devel libmcrypt-devel openssl openssl-devel php-mysql
2、下载 php-5.6.33.tar.gz
http://php.net/distributions/php-5.6.33.tar.gz
3、编译安装php
[root@node3 ~]# tar xf php-5.6.33.tar.gz
[root@node3 ~]# cd php-5.6.33/
[root@node3 php-5.6.33]# ./configure –prefix=/usr/local/php5 –with-mysql=mysqlnd –with-pdo-mysql=mysqlnd –with-mysqli=mysqlnd –with-openssl –enable-mbstring –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir=/usr –enable-xml –enable-sockets –enable-fpm –with-mcrypt –with-config-file-path=/etc/php5/ –with-config-file-scan-dir=/etc/php5.d –with-bz2
[root@node3 php-5.6.33]# make -j 2 && make install
4、配置php-fpm
4.1复制php.ini-production 到/etc/php5/php.ini
[root@node3 php-5.6.33]# mkdir /etc/php5{,.d}
[root@node3 php-5.6.33]# cp php.ini-production /etc/php5/php.ini
4.2复制sapi/fpm/init.d.php-fpm到/etc/rc.d/init.d/php-fpm
[root@node3 php-5.6.33]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
4.3添加执行权限:php-fpm
[root@node3 php-5.6.33]# chmod +x /etc/rc.d/init.d/php-fpm
4.4将php-fpm添加到系统服务
[root@node3 php-5.6.33]# chkconfig –add php-fpm
4.5修改php-fpm.conf配置文件
[root@node3 php-5.6.33]# cd /usr/local/php5/etc/
[root@node3 etc]# cp php-fpm.conf.default php-fpm.conf
[root@node3 etc]# vim php-fpm.conf
user = nginx
group = nginx
修改监听为:listen = 0.0.0.0:9000
设置进程并发数,默认为5,pm.max_children = 50
刚开始的进程数,默认为2,pm.start_servers = 5
最少空闲进程数,默认为1,pm.min_spare_servers = 2
最少空闲进程数,默认为3,pm.max_spare_servers = 5
修改pid = /usr/local/php5/var/run/php-fpm.pid
4.6 新建一个nginx用户,用户和组id与node1一样
[root@node1 ~]# id nginx
uid=300(nginx) gid=300(nginx) groups=300(nginx)
[root@node3 etc]# groupadd -r -g 300 nginx
[root@node3 etc]# useradd -r -g 300 -u 300 -s /sbin/nologin nginx
4.7 新建一个mysql用户,用户和组id与node2一样
[root@node3 etc]# groupadd -r -g 306 mysql
[root@node3 etc]# useradd -r -g 306 -u 306 -s /sbin/nologin mysql
4.8 修改php.ini文件
[root@node3 etc]# pwd
/usr/local/php5/etc
[root@node3 etc]# vim /etc/php5/php.ini
short_open_tag = On
4.9启动php-fpm服务
[root@node3 etc]# systemctl start php-fpm
四、整合nginx和php
1、修改nginx配置文件
[root@node1 ~]# cd /usr/local/nginx/
[root@node1 nginx]# vim conf/nginx.conf
location / {
root /htdoc;
index index.php index.html index.htm;
}
location ~ .php$ {
root /htdoc;
fastcgi_pass 192.168.10.203:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
2、修改conf/fastcgi_params文件
[root@node1 nginx]# vim conf/fastcgi_params
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
五、测试LNMP
1、修改node1、node2、node3的SELinux:
setsebool -P httpd_can_network_connect 1
2、node3新建/htdoc/目录并创建一个测试页index.php
[root@node3 ~]# vim /htdoc/index.php
<?php
$conn = mysql_connect('192.168.10.202','root','123456');
if($conn)
echo "connect maraidb OK…";
else
echo "connect mariadb Fail…";
mysql_close();
phpinfo();
?>
修改属主、属组:chown -R nginx.nginx /htdoc/*
3、nfs共享
[root@node3 etc]# vim /etc/exports
/htdoc *(rw)
[root@node3 etc]# exportfs -rv
4、node1新建/htdoc目录,属主、属组为nginx
[root@node1 ~]# mkdir /htdoc
[root@node1 ~]# chown -R nginx.nginx /htdoc
5、node1挂载node3的共享目录/htdoc
[root@node1 ~]# mount -t nfs 192.168.10.203:/htdoc/ /htdoc/
重启php-fpm、mysqld、nginx服务
浏览器打开:http://192.168.10.201/
OK。。。LNMP分布式部署成功。。。
简单部署wordpress博客
前面已经部署好LNMP环境。
1、到wordpress官网下载wordpress,下载到node3的/htdoc目录中
[root@node3 htdoc]# tar xf wordpress-4.8.1-zh_CN.tar.gz
2、解压wordpress
3、配置wordpress
[root@node3 htdoc]# cp wp-config-sample.php wp-config.php
[root@node3 htdoc]# vim wp-config.php
define('DB_NAME', 'wpdb');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'wppasswd');
define('DB_HOST', '192.168.10.202');
文件末尾添加:
require_once(ABSPATH . 'wp-settings.php');
define("FS_METHOD","direct");
define("FS_CHMOD_DIR", 0777);
define("FS_CHMOD_FILE", 0777);
4、创建数据库
数据库名:wpdb 用户和密码:wpuser、wppasswd
[root@node2 ~]# mysql
MariaDB [mysql]> CREATE DATABASE wpdb;
MariaDB [(none)]> GRANT ALL ON wpdb.* TO 'wpuser'@'%' IDENTIFIED BY 'wppasswd';
MariaDB [mysql]> FLUSH PRIVILEGES;
浏览器打开:http://192.168.10.201/wp-admin/install.php
注册安装即可。