12.1 LNMP架构介绍

LNMP就是Linux+Nginx+MySQL+PHP,Linux作为服务器的操作系统,MySQL即为数据库,Nginx为一款高性能Web服务器,本身是不能处理PHP的,当接收到请求时,判断如果是PHP请求就会将请求交给PHP解释器处理,然后将结果返回给Client。Nginx一般把请求转发给fast-cgi管理进程处理,fast-cgi管理进程再选择cgi子进程处理请求,然后把结果返给Nginx。 Apache+PHP 和 Nginx+PHP的区别 Apache一般是把PHP当做自己的一个模块来启动;和LAMP不同的是,提供web服务的是Nginx,并且php是作为一个独立服务存在的,这个服务叫做php-fpm,Nginx直接处理静态请求,动态请求会转发给php-fpm,而Ngnix则是把http请求变量转发给PHP进程,即PHP独立进程,与Ngnix通信,这种方式叫做Fast-CGI运行方式。所以Apache所编译的PHP不能用于Nginx。 Nginx+PHP的基本结构图如下:

12.2 MySQL安装

1、安装前准备 ##创建用户

[root@localhost ~]#useradd -s /sbin/nologin mysql
[root@localhost ~]# id mysql
uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)

##创建数据目录。

[root@localhost ~]mkdir -p /data/mysql
[root@localhost ~]chown -R mysql.mysql /data/mysql
[root@localhost ~]ll -d /data/mysql/
drwxr-xr-x 2 mysql mysql 6 6月  25 11:29 /data/mysql/

##安装mysql所需依赖包

[root@localhost ~]yum install -y gcc gcc-c++ make cmake ncurses-devel bison-devel autoconf libtool libXpm-devel libvpx-devel gmp-devel

注:如果缺少这些依赖包,编译过程会保错,源码安装大部分报错为缺少依赖包的引起的 2、安装mysql 方式1:源码编译安装MySQL

#进入软件源码存放目录
[root@localhost ~]cd /usr/local/src/
#下载源码包
[root@localhost src]wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36.tar.gz
#解压源码包
[root@localhost src]tar xvf mysql-5.6.36.tar.gz 
#进入解压后的源码目录
[root@localhost src]cd mysql-5.6.36  
#设置安装参数,cmake相当于configure
##下面的反斜杠是脱义字符,加上它我们可以把一行命令写成多行
[root@localhost ~]cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \  #指定mysql安装目录
-DMYSQL_DATADIR=/data/mysql \                       #指定数据存放的目录
-DSYSCONFDIR=/etc/ \                                         #指定配置文件所在目录
-DWITH_MYISAM_STORAGE_ENGINE=1 \         #安装启用myisam引擎支持
-DWITH_INNOBASE_STORAGE_ENGINE=1 \    #安装启用innodb引擎支持
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \         #指定本地sock文件
-DMYSQL_TCP_PORT=3306 \                            #指定TCP端口为3306
-DENABLED_LOCAL_INFILE=1 \                        #启用本地数据导入支持
-DWITH_PARTITION_STORAGE_ENGINE=1 \ #安装数据库分区
-DEXTRA_CHARSETS=all \                                #启用额外的字符集类型(默认为all)
-DDEFAULT_CHARSET=utf8 \                            #指定默认的字符集为utf8
-DDEFAULT_COLLATION=utf8_general_ci        #设定默认排序规则(utf8_general_ci快速/utf8_unicode_ci准确)
此处省略cmake过程
[root@localhost mysql-5.6.36]echo $?    ##检查是否有错误。
0
[root@localhost mysql-5.6.36]make && make install  #编译 && 安装 
...
省略编译安装的过程
[root@localhost mysql-5.6.36]# echo $?    ##再次检查安装是否有错误。如果是0就表示安装没问题。
0

方式2:二进制包安装MySQL 源代码方式和二进制包是软件包的两种形式。二进制包里面包括了已经经过编译,可以马上运行的程 序。你只需要下载和解包(安装)它们以后,就马上可以使用。源代码包里面包括了程序原始的程序代码,需要在你的计算机上进行编译以后才可以产生可以运行程 序,所以从源代码安装的时间会比较长

#进入软件源码存放目录
[root@localhost ~]cd /usr/local/src/
#下载二进制包
[root@localhost src]wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
#解压二进制包
[root@localhost src]tar xvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
#将解压好的目录移动到/usr/local/目录下重命名为mysql
[root@localhost src]mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
#进入/usr/local/mysql目录
[root@localhost src]cd /usr/local/mysql
###到此安装成功

3、初始化配置

#初始化数据库
[root@localhost ~]cd /usr/local/mysql/
[root@localhost mysql]./scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql
#备份初始配置文件
[root@localhost mysql]cp /etc/my.cnf /etc/my.cnf.bak 
 #清空配置文件
[root@localhost mysql]echo > /etc/my.cnf 
#编辑配置文件写入下面的内容后保存退出
[root@localhost mysql]vim /etc/my.cnf   
###################################
[mysqld]
port = 3306
basedir=/usr/local/mysql
datadir=/data/mysql/
socket=/tmp/mysql.sock
user=mysql
default-time-zone=system
default-storage-engine=InnoDB
log-error=/var/log/mysqld.log
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
###################################
##将mysql启动脚本放入/etc/init.d/目录中重命名为mysqld
[root@localhost ~]cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
##编辑启动脚本
[root@localhost mysql]# vi /etc/init.d/mysqld 
把下面两个修改一下,不然启动会报错
basedir=/user/local/mysql               #修改成mysql的安装目录
datadir=/data/mysql                        #修改成mysql的数据目录       
##将mysql启动脚本加入chkconfig管理
[root@localhost ~]# chkconfig --add mysqld 
##设置mysql开机自启动
[root@localhost ~]# chkconfig mysqld on

12.3/12.4 PHP安装

和LAMP安装PHP方法有差别,需要开启php-fpm服务 1、下载、解压源码包

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget http://mirrors.sohu.com/php/php-5.6.30.tar.gz
[root@localhost src]# tar zxf php-5.6.30.tar.gz

2、编译安装PHP

#先创建php-fpm用户

[root@localhost src]# useradd -s /sbin/nologin php-fpm

#安装依赖包

[root@localhost src]# yum -y install gcc libcurl-devel libxml2-devel openssl-devel bzip2-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

#创建配置文件目录

[root@localhost src]# mkdir -p /usr/local/php-fpm/etc

#configure设置安装参数

[root@localhost src]# cd php-5.6.30
[root@localhost php-5.6.30]# ./configure --prefix=/usr/local/php-fpm \
--with-config-file-path=/usr/local/php-fpm/etc \
--enable-fpm \
--with-fpm-user=php-fpm \
--with-fpm-group=php-fpm \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-mysql-sock=/tmp/mysql.sock \
--enable-mysqlnd \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir \
--with-mcrypt \
--enable-soap \
--enable-gd-native-ttf \
--enable-ftp \
--enable-mbstring \
--enable-exif \
--with-pear \
--with-curl \
--with-openssl

#编译、安装

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

#检查是否出错

[root@localhost php-5.6.30]# echo $? 
0

#参数说明:

--prefix=/usr/local/php-fpm #设定安装目录        
--with-config-file-path=/usr/local/php-fpm/etc #谁定php-fpm配置文件所在目录
--enable-fpm     #开启php-fpm模式  
--with-fpm-user=php-fpm #设定php-fpm服务的用户
--with-fpm-group=php-fpm #设定php-fpm服务的用户组
--with-mysql=/usr/local/mysql #设定mysql库,这种方式基本已经废弃
--with-mysqli=/usr/local/mysql/bin/mysql_config #最新的mysqli连接库
--with-pdo-mysql=/usr/local/mysql #mysqli连接库
--with-mysql-sock=/tmp/mysql.sock #指定mysql.sock文件路径
#其他参数都和LAMP相同

#复制初始配置文件到configure指定的配置文件存放目录下改名为php.ini

[root@localhost php-5.6.30]# cp php.ini-production /usr/local/php-fpm/etc/php.ini

#配置/usr/local/php-fpm/etc/php-fpm.conf配置文件

[root@localhost php-5.6.30]# vi /usr/local/php-fpm/etc/php-fpm.conf  #写入下面的内容,保存
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 65535

#复制启动脚本到/etc/init.d/目录下重命名为php-fpm

[root@localhost php-5.6.30]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

#修改/etc/init.d/php-fpm文件的权限

[root@localhost php-5.6.30]# chmod 755 /etc/init.d/php-fpm

#加入chkconfig管理

[root@localhost php-5.6.30]# chkconfig --add php-fpm

#设置开机启动

[root@localhost php-5.6.30]# chkconfig php-fpm on

#启动php-fpm服务

[root@localhost php-5.6.30]# service php-fpm start

#查看php-fpm服务进程是否正常开启。

[root@localhost php-5.6.30]# ps aux |grep php-fpm

12.5 Nginx介绍

Nginx官网:nginx.org Nginx应用场景:web服务、反向代理、负载均衡 Nginx著名分支,淘宝基于Nginx开发的Tengine,使用上和Nginx一致,服务名,配置文件名都一样, 和Nginx的最大区别在于Tenging增加了一些定制化模块,在安全限速方面表现突出,另外它支持对js,css合并 Nginx核心+lua相关的组件和模块组成了一个支持lua的高性能web容器openresty 参考链接

12.6 Nginx安装

#下载、解压源码包

[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget http://mirrors.sohu.com/nginx/nginx-1.12.1.tar.gz
[root@localhost src]# tar zxf nginx-1.12.1.tar.gz

#配置参数、编译、安装

[root@localhost src]# cd nginx-1.12.1
[root@localhost nginx-1.12.1]# ./configure --prefix=/usr/local/nginx

#编译、安装

[root@localhost nginx-1.12.1]# make &&  make install

#检查是否出错

[root@localhost nginx-1.12.1]# echo $? 
0

#编辑nginx启动脚本

[root@localhost nginx-1.12.1]# vi /etc/init.d/nginx    #写入以下内容 
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings

NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"

start() 
{
    echo -n $"Starting $prog: "
    mkdir -p /dev/shm/nginx_temp
    daemon $NGINX_SBIN -c $NGINX_CONF
    RETVAL=$?
    echo
    return $RETVAL
}

stop() 
{
    echo -n $"Stopping $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -TERM
    rm -rf /dev/shm/nginx_temp
    RETVAL=$?
    echo
    return $RETVAL
}

reload()
{
    echo -n $"Reloading $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -HUP
    RETVAL=$?
    echo
    return $RETVAL
}

restart()
{
    stop
    start
}

configtest()
{
    $NGINX_SBIN -c $NGINX_CONF -t
    return 0
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload)
        reload
        ;;
  restart)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
        RETVAL=1
esac

exit $RETVAL

#修改脚本权限并加入开机启动

[root@localhost nginx-1.12.1]# chmod 755 /etc/init.d/nginx
[root@localhost nginx-1.12.1]# chkconfig --add nginx 
[root@localhost nginx-1.12.1]# chkconfig nginx on 
[root@localhost nginx-1.12.1]# cd /usr/local/nginx/conf/; mv nginx.conf nginx.conf.bak

#修改nginx配置文件

[root@localhost conf]# vi nginx.conf    #写入下面的内容
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
{
   use epoll;
   worker_connections 6000;
}

http
{
   include mime.types;
   default_type application/octet-stream;
   server_names_hash_bucket_size 3526;
   server_names_hash_max_size 4096;
   log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
   ' $host "$request_uri" $status'
   ' "$http_referer" "$http_user_agent"';
   sendfile on;
   tcp_nopush on;
   keepalive_timeout 30;
   client_header_timeout 3m;
   client_body_timeout 3m;
   send_timeout 3m;
   connection_pool_size 256;
   client_header_buffer_size 1k;
   large_client_header_buffers 8 4k;
   request_pool_size 4k;
   output_buffers 4 32k;
   postpone_output 1460;
   client_max_body_size 10m;
   client_body_buffer_size 256k;
   client_body_temp_path /usr/local/nginx/client_body_temp;
   proxy_temp_path /usr/local/nginx/proxy_temp;
   fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
   fastcgi_intercept_errors on;
   tcp_nodelay on;
   gzip on;
   gzip_min_length 1k;
   gzip_buffers 4 8k;
   gzip_comp_level 5;
   gzip_http_version 1.1;
   gzip_types text/plain application/x-javascript text/css text/htm 
   application/xml;

   server
   {
       listen 80;
       server_name localhost;
       index index.html index.htm index.php;
       root /usr/local/nginx/html;

       location ~ \.php$ 
       {
           include fastcgi_params;
           fastcgi_pass unix:/tmp/php-fcgi.sock;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
       }    
   }
}

nginx.conf配置文件详解:【参考链接】

#检查配置文件是否有错误

[root@localhost conf]# /usr/local/nginx/sbin/nginx -t

#启动nginx服务

[root@localhost conf]# /etc/init.d/nginx  start

#检查80端口是否开始监听

[root@localhost conf]# netstat -lntp |grep 80

#防火墙允许80端口访问

[root@localhost conf]# firewall-cmd --add-port=80/tcp --permanent
[root@localhost conf]# firewall-cmd --reload

扩展 Nginx为什么比Httpd高效:原理篇 http://www.toxingwang.com/linux-unix/linux-basic/1712.html mod_php 和 mod_fastcgi以及php-fpm的比较 http://dwz.cn/1lwMSd 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM http://www.nowamagic.net/librarys/veda/detail/1319/ https://www.awaimai.com/371.html