LNMP分离部署

什么是CGI

CGI(Common Gateway Interface)全称为:通用网关接口,为HTTP服务器与其他机器上的程序服务通信交流的一种工具,CGI程序必须运行在网络服务器上

什么是FastCGI

  • FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口(在Linux下FastCGI接口为socket,这个socket可以是文件socket,也可以是IP socket)
  • FastCGI采用C/S架构,他可以将HTTP服务器和脚本解析服务器分开,同时还能在脚本解析服务器上启动一个或多个脚本老解析守护进程。当HTTP服务器遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器,这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能

FastCGI的特点

  1. HTTP服务器和动态脚本语言间通信的接口或工具
  2. 可把动态语言解析和HTTP服务器分离开
  3. nginx、apache、Lighttpd,以及多数动态语言都支持FastCGI
  4. FastCGI接口方式采用C/S结构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)
  5. PHP动态语言服务器端可以启动多个FastCGI的守护进程(例如php-fpm)
  6. HTTP服务器通过(例如 nginx fastcgi_pass) FastCGI客户端和动态语言FastCGI服务器端通信(例如php-fpm)

Nginx FastCGI的运行原理

nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在linux下是socket,为了调用CGI程序,还需要一个FastCGI的wrapper(可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定的socket上,如端口或文件socket,当nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或外部程序处理脚本来读取返回的数据;接着wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给nginx;最后nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程

LNMP安装部署与配置

实验环境

都关闭防火墙!!!
[root@localhost ~]# systemctl stop firewalld.service

角色NginxMySQLPHP
IP地址192.168.1.11192.168.1.22192.168.1.33

安装nginx

创建nginx用户

[root@localhost ~]# useradd -M -s /sbin/nologin nginx

安装所需要的依赖包

[root@localhost ~]# yum -y install gcc* perl openssl openssl-devel pcre-devel zlib-devel

解压nginx安装包

首先下载nginx1.11.5安装包

[root@localhost ~]# tar -zxvf nginx-1.11.5.tar.gz

编译安装nginx

[root@localhost nginx-1.11.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install

优化路径

[root@localhost nginx-1.11.5]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

启动nginx

[root@localhost nginx-1.11.5]# nginx

安装MySQL

创建mysql用户和组

[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql

检测本机有没有安装MySQL

有则rpm -e卸载

[root@localhost ~]# rpm -qa | grep mysql

安装所需要的依赖包

[root@localhost ~]# yum -y install gcc* cmake bison autoconf

解压MySQL安装包

首先还是需要下载MySQL安装包

[root@localhost ~]# tar -zxvf mysql-5.5.22.tar.gz -C /usr/src/

编译安装MySQL

[root@localhost ~]# cd /usr/src/mysql-5.5.22/

[root@localhost mysql-5.5.22]# cmake \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
> -DMYSQL_DATADIR=/usr/local/mysql/data
> -DSYSCONFDIR=/etc/ \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DWITH_EXTRA_CHARSETS=all \
> -DENABLED_LOCAL_INFILE=1 \

参数按照需求灵活添加即可

然后删除CMakeCache.txt 并安装ncurses-devel

[root@shuai mysql-5.5.22]# rm -rf CMakeCache.txt

[root@shuai mysql-5.5.22]# yum -y install ncurses-devel

然后再次执行操作就可以了

[root@localhost mysql-5.5.22]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1

出现上图这个代表编译成功

最后一定不要忘了安装

[root@shuai mysql-5.5.22]# make && make install

优化目录并给予权限

[root@localhost mysql-5.5.22]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
[root@localhost mysql-5.5.22]# ln -s /usr/local/mysql/bin/* /usr/local/bin/
[root@localhost mysql-5.5.22]# chown -R mysql:mysql /usr/local/mysql/

复制MySQL配置文件

[root@localhost mysql-5.5.22]# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

初始化数据库

[root@localhost mysql-5.5.22]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

出现两个ok表示成功!

将MySQL加入系统服务

[root@localhost mysql-5.5.22]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql-5.5.22]# chmod +x /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.5.22]# vim /etc/init.d/mysqld

添加系统变量

[root@localhost ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost ~]# source /etc/profile

启动MySQL

[root@localhost ~]# service mysqld start

进入MySQL数据库

[root@localhost ~]# mysql -uroot -p

修改MySQL数据库密码

[root@localhost ~]# mysqladmin -uroot -p password  "123.com"    //设置新密码为123.com
Enter password:                                       //输入原密码,为空,直接回车

[root@localhost ~]# mysql -uroot -p
Enter password:                                    //再次登陆,密码为123.com

建议安装超级好用的MySQL数据库命令行工具:mycli

安装mycli

[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum -y install python-pip python-devel
[root@localhost ~]# pip install mycli

进入数据库命令

[root@localhost ~]# mycli -uroot

mycli功能:高亮显示;自动提示,安装完以后终于可以在MySQL里面按Tab了

安装PHP

解压PHP安装包

首先还是要先下载php安装包

[root@localhost ~]# tar -zxvf php-5.3.28.tar.gz

安装所需要的依赖包

[root@localhost ~]# yum -y install gcc* gd libxml2-devel libjpeg-devel libpng-devel

编译安装PHP

[root@localhost ~]# cd php-5.3.28/
[root@localhost php-5.3.28]# ./configure \
> --prefix=/usr/local/php \
> --with-config-file-path=/usr/local/php \
> --with-gd \
> --with-zlib \
> --with-mysql=mysqlnd \
> --with-pdo-mysql=mysqlnd \
> --with-mysqli=mysqlnd \
> --enable-fpm \
> --enable-mbstring \
> --with-jpeg-dir=/usr/lib

注意

--with-mysql=/usr/local/mysql
需要指定mysql的安装路径,安装PHP需要的MySQL相关内容。当然如果没有MySQL软件包,也可以不单独安装,这样的情况可使用--with-mysql=mysqlnd替代--with-mysql=/usr/local/mysql因为PHP软件里面已经自带连接MySQL的客户端工具

参数按照需求灵活添加即可

[root@localhost php-5.3.28]# make && make install

拷贝PHP配置文件

[root@localhost php-5.3.28]# cp php.ini-development /usr/local/php/php.ini

修改PHP配置文件

[root@localhost ~]# vim /usr/local/php/php.ini
搜索并修改参数为如下值
default_charset = "utf-8"
short_open_tag = On

把php-fpm加入系统服务

[root@localhost php-5.3.28]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.3.28]# chmod +x /etc/init.d/php-fpm

修改php-fpm配置文件

[root@localhost php-5.3.28]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# vim php-fpm.conf
搜索并修改参数为如下值
pid = run/php-fpm.pid        # 设置pid文件的位置
pm.max_children = 50         # 同一时刻能够给的最大子进程数量
pm.start_servers = 20        # 在启动时启动的子进程数量
pm.min_spare_servers = 5     # 处于空闲"idle"状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 35    # 最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉。
注意:

在php-fpm的配置文件中,有两个指令非常重要,就是"pm.max_children" 和 "request_terminate_timeout"

  1.  第一个指令"pm.max_children" 确定了php-fpm的处理能力,原则上时越多越好,但这个是在内存足够打的前提下,每开启一个php-fpm进程要占用近30M左右的内存。如果请求访问较多,那么可能会出现502,504错误。对于502错误来说,属于繁忙进程而造成的,对于504来说,就是客户发送的请求在限定的时间内没有得到相应,过多的请求导致“504  Gateway  Time-out”。这里也有可能是服务器带宽问题。
  2.     另外一个需要注意的指令"request_terminate_timeout",它决定php-fpm进程的连接/发送和读取的时间,如果设置过小很容易出现"502 Bad Gateway" 和 “504  Gateway  Time-out”,默认为0,就是说没有启用,不加限制,但是这种设置前提是你的php-fpm足够健康,这个需要根据实际情况加以限定。

重启php-fpm

[root@localhost etc]# service php-fpm restart

整合nginx与PHP

nginx服务器:

创建目录并给予权限

[root@localhost html]# mkdir /www
[root@localhost ~]# vim /www/index.php
<?php
phpinfo();
?>
[root@localhost html]# chown -R nginx:nginx /www/

修改nginx配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
# 添加如下配置文件
        location / {
            root   /www;
            index  index.php index.html index.htm;
        }

        location ~ \.php$ {
            root           /www;
            fastcgi_pass   192.168.1.33:9000;           # PHP服务器IP地址
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

PHP服务器:

创建目录,创建用户,给予权限

[root@localhost ~]# mkdir /www
[root@localhost ~]# vim /www/index.php
<?php
    phpinfo();
?>
[root@localhost ~]# useradd nginx
[root@localhost ~]# chown -R nginx:nginx /www/

修改php-fpm配置文件

[root@localhost ~]# vim /usr/local/php/etc/php-fpm.conf
搜索并修改参数为如下值
listen = 192.168.1.33:9000        # 本机IP
user = nginx
group = nginx
[root@localhost ~]# service php-fpm restart

建立nfs共享目录

[root@localhost ~]# vim /etc/exports
# 添加如下配置
/www 192.168.1.0/24(rw,no_root_squash,sync)

启动nfs服务

[root@localhost ~]# systemctl start nfs

nginx服务器:

查询挂载点

[root@localhost ~]# showmount -e 192.168.1.33
Export list for 192.168.1.33:
/www 192.168.1.0/24

挂载

[root@localhost ~]# mount -t nfs 192.168.1.33:/www/ /www/

查询是否挂载成功

[root@localhost ~]# df -h
文件系统                  容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   37G  4.4G   33G   12% /
devtmpfs                 470M     0  470M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  8.3M  479M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               1014M  166M  849M   17% /boot
tmpfs                     98M   12K   98M    1% /run/user/42
tmpfs                     98M     0   98M    0% /run/user/0
192.168.1.33:/www         37G  5.3G   32G   15% /www

访问nginx

[root@localhost ~]# firefox 192.168.1.11
# 出现PHP页面代表成功

整合PHP与MySQL

MySQL服务器:

进入数据库

[root@localhost ~]# mysql -uroot -p123.com

给予权限

mysql> grant all on *.* to 'root'@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
mysql> Bye

挂载

[root@localhost ~]# mkdir /www
[root@localhost ~]# mount -t nfs 192.168.1.33:/www/ /www/

解压Discuz论坛压缩包

[root@localhost ~]# unzip Discuz_7.2_FULL_SC_UTF8.zip
[root@localhost ~]# mv upload/* /www/

给予权限

[root@localhost ~]# chmod -R 777 /www/
[root@localhost ~]# chown -R nginx:nginx /www/

访问测试

[root@localhost ~]# firefox 192.168.1.11/install

Last modification:July 23rd, 2020 at 10:14 pm
如果觉得我的文章对你有用,请随意赞赏