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的特点
- HTTP服务器和动态脚本语言间通信的接口或工具
- 可把动态语言解析和HTTP服务器分离开
- nginx、apache、Lighttpd,以及多数动态语言都支持FastCGI
- FastCGI接口方式采用C/S结构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)
- PHP动态语言服务器端可以启动多个FastCGI的守护进程(例如php-fpm)
- 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
角色 | Nginx | MySQL | PHP |
IP地址 | 192.168.1.11 | 192.168.1.22 | 192.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"
- 第一个指令"pm.max_children" 确定了php-fpm的处理能力,原则上时越多越好,但这个是在内存足够打的前提下,每开启一个php-fpm进程要占用近30M左右的内存。如果请求访问较多,那么可能会出现502,504错误。对于502错误来说,属于繁忙进程而造成的,对于504来说,就是客户发送的请求在限定的时间内没有得到相应,过多的请求导致“504 Gateway Time-out”。这里也有可能是服务器带宽问题。
- 另外一个需要注意的指令"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
6 comments
还有一个uwsgi也很重要
是的啊,CGI是web框架的基础,所以当初说uwsgi的时候,就是提醒一下
暂时用不上 :xiaonian:
左下角那个不要点我功能不错。。。。。连续点了几十下差点把我整死机了 :zhenbang:
哈哈哈,是我的错 :huaji: