☞LAMP

LAMP



  • Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,由于常被放在一起使用,因此称之为LAMP,LAMP是最强大的网站解决方案,举例来说Wikipedia使用的MediaWiki软件是在Linux下开发,由Apache HTTP服务器提供内容,在MySQL数据库中存储内容,PHP来实现程序逻辑。

  • LAMP具有Web资源丰富、轻量、快速开发的特点,其优势在于通用、跨平台、高性能、低价格,因此LAMP无论是性能、质量还是价格都是企业搭建网站的首选方案。

  • 动态网站服务器组合形式: 
    AMP:httpd+php|python+mysql/mongodb 
    AMT:httpd+jsp+mysql/mongodb:jsp(tomcat, jetty, resin, jboss, websphere, weblogic)

  • 理解Web资源的概念:

    1. 静态资源:原始形式与响应给客户端的结果一致,如jpeg,html,plaintext,占80%

    2. 动态资源:原始形式通常为程序文件,需运行对应环境的子进程返回执行结果,占20%.但需要IO请求的资源大约为20%.

  • amp的工作过程

    1. 静态资源:Client –> http –> httpd (IO操作)

    2. php动态资源:Client –> http –> httpd –> libpphp5.so (IO操作,php-mysql) –> mysql –> mysqld

    3. 如此一来,动态资源的响应时间慢于静态资源的访问,一般静态资源占比例为80%,动态资源占20%.另外一点,服务器端可将Web资源分散在多个虚拟主机的方法增加并行请求数,或使得动态资源静态化的方式提高响应速度,也就是所谓的网站静态化。

  • CGI:Common Gateway Interface 
    CGI协议定义了Web服务器程序与后端服务进程进行数据交换的规范,以prefork为例,Browser并行请求多个资源时,httpd为每个请求建立一个子进程,如果请求动态资源时,httpd调用php模块对动态资源进行处理,再返回给Web服务器响应客户端。过程中httpd与php及mysqld之间的通信就使用了CGI接口。

php –> httpd

php是可嵌入html中的程序,支持不同的存储、字符、加密解密的功能,这些机制都是模块化(extensions)实现的,如php与MySQL的连接需安装php-mysql模块。

php的模块是为了丰富 php 功能的扩展,而php作为httpd的模块是为了让Web服务器支持动态Web资源解析的功能。

  • httpd与php的结合方式主要有三种: 

    1. CGI:由php解释器与httpd通过CGI通信

    2. Module:不同的mpm需要不同的php程序包,无法混用 
      prefork:libphp程序包 
      worker, event:libphp-zts程序包

    3. FastCGI 
      fcgi是简装版的CGI协议,httpd只把URL重新封装后通过 FCGI 传递给 fcgi 服务端,动态资源由 fcgi 服务器端从 mysql 加载,处理完成再返回给httpd,此时httpd相当于是一个反向的代理服务器,接收任意客户端的请求,为fcgi Server提供服务。 
      此时php以fpm机制监听在一个套接字上,可运行在另一台主机上,如httpd作为一个反向代理服务器且分发动态资源请求给多个fcgi服务器,以完成更好的动态资源处理,当然需要处理好用户section丢失的问题,一种方式通过ip地址识别用户;另一种方式通过绑定cookie,且同步section给多态服务器;另一种方式是把section放在单独的具有冗余功能的服务器中保存在redis(nosql)数据库中; 
      php-fpm工作模式类似于httpd的prefork,主控进程接收请求,通过创建子进程处理httpd客户端的并发请求。子进程可按需生成,也可动态生成,通过连接池机制管理子进程的数量和状态,有活动、空闲、未激活等几种状态。

Module形式安装php

安装php模块,查看两部分配置文件

yum -y install php          #作为httpd的modules
rpm -ql | grep php
rpm -ql php-common          #公共组件,能够被httpd与php解释器调用

#作为httpd模块的php配置文件:/etc/httpd/conf.d/php.conf
#php核心的配置文件:/etc/php.ini, /etc/php.d/*.ini

vi /etc/php.ini
   格式:[section_id]
   ;;;;;;;;;;;;;;;;;;;
   ; Quick Reference ;
   ;;;;;;;;;;;;;;;;;;;
   ; display_errors
   ;   Default Value: On           #默认为开发环境
   ;   Development Value: On       #开发环境
   ;   Production Value: Off       #生产环境

   date.timezone = Asia/Shanghai   #默认读取系统时区,会有waring

FastCGI方式安装php

PHP-FPM 是一个简单可靠的 FastCGI 进程管理器(FastCGI Process Manager),从 PHP 5.3.3 开始就成为了 PHP 的内置管理器。Apache 官方网站也提供了配置 Apache httpd 2.4.x 使用 mod_proxy_fcgi 和 PHP-FPM 运行 php 程序的基本方法和设置运行方式的简单介绍。

php-fpm(FastCGI Process Manager)作为独立的守护进程,侦听一个套接字,接收并响应来自前端程序的请求,即httpd为FastCGI客户端。对于繁忙的站点能提升并发性能。因为 Apache 可以专心处理除 php 之外的静态网页及元素,反而 httpd 进程本身占用的 CPU 和内存可以显著降低,从而从整体上降低资源消耗。另外一点是方便后期升级为分布式的Web服务器。

代理服务器的概念:

  • 正向:为有限客户端发送给任意服务器,服务于客户端

  • 反向:接收来自任意客户端请求,发送给有限服务器,服务于服务端

php的配置文件

  1. iniphp解释器工作环境的配置文件:/etc/php.ini, /etc/php.d/*.ini 
    官方说明:http://php.net/manual/zh/ini.core.php

vi /etc/php.ini
   格式:[section_id]
   ;;;;;;;;;;;;;;;;;;;
   ; Quick Reference ;
   ;;;;;;;;;;;;;;;;;;;
   ; display_errors
   ;   Default Value: On           #默认为开发环境
   ;   Development Value: On       #开发环境
   ;   Production Value: Off       #生产环境

   date.timezone = Asia/Shanghai   #默认读取系统时区,会有waring
  1. conffpm守护进程的配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf 
    官方说明:http://php.net/manual/zh/ini.list.php

安装php-fpm,配置php-fpm.conf文件

#在httpd-2.4中fcgi集成了模块
httpd -M|grep fcgi      #httpd为反向代理服务器,依赖于proxy_module

#httpd-2.4安装php-fpm
yum install php-fpm 需加上 php-mysql php-xcache php-mcrypt
rpm -ql php-fpm

#php守护进程(主进程)配置文件
vim /etc/php-fpm.conf
   ;;;;;;;;;;;;;;;;;;
   ; Global Options ;
   ;;;;;;;;;;;;;;;;;;
   emergency_restart_threshold = 0         #子进程异常退出重启的上限
   emergency_restart_interval = 0
   daemonize = no                   #守护进程前后台,systemd机制不需守护进程
                                    #后台运行,运行在前台即托管给systemd
   ;;;;;;;;;;;;;;;;;;;;
   ; Pool Definitions ;             #连接池配置
   ;;;;;;;;;;;;;;;;;;;;
   ; See /etc/php-fpm.d/*.conf

#连接池的配置文件
vim /etc/php-fpm.d/www.conf
   listen = ip:9000                #本机公网的ip:9000
   listen.backlog = -1             #等待队列无上限,0没有队列
   listen.allowed_clients = ip     #允许的客户端来源ip,comma分隔

   user = apache                   #子进程的默认为apache账号运行
   group = apache
   pm = dynamic                    #连接池中子进程的为动态创建
       static:a fixed number (pm.max_children) of child processes;
       dynamic:……
   pm.max_chlidren = 50
   pm.start_servers = 5
   pm.min_spare_servers = 5
   pm.max_spare_servers = 35
   pm.max_requests = 500
   pm.status_path = /pm-status             #资源状态/status
   ping.path = /ping                       #ip/ping监控fpm进程
   ping.response = pong                    显示pong
   request_terminate_timeout = 0           #资源请求超时
   rlimit_files = 1024                     #文件描述符限制
   rlimit_core = 0                         #内存限制

   php_value[session.save_handler] = files    #session存储为文件
   php_value[session.save_path] = /var/lib/php/session  #apache要w权限

#创建存放用户session的目录
mkdir /var/lib/php/session
chown -R apache:apache /var/lib/php/session

#启动php-fpm服务
systemctl start php-fpm.service
ss -tnl         #9000端口

httpd反向代理至php-fpm 
目前 Apache 转发代理的方式,也就是 Apache 发送 php 处理请求给 PHP-FPM 的方式,有 3 种: 

  1. ProxyPass

  2. ProxyPassMatch

  3. 带 [P] 参数的 mod_rewrite

  • 与php-fpm与httpd主机上运行

#创建虚拟主机
vim /etc/httpd/conf.d/vh_fpm.conf

<VirtualHost *:80>
   DocumentRoot "/data/htdoc/vh_fpm"    
   ServerName www.fpm.com
   DirectoryIndex index.html index.php     #主页检测
   <Directory "/data/htdoc/vh_fpm">
       ……
   </Directory>

   ProxyRequests Off                      #关闭httpd的正向代理


(1)所有.php资源,通过 mod_proxy_fcgi 转发的代理,使用 fastCGI 协议,转到 PHP-FPM 监听的端口
(2)127.0.0.1本机的php-fpm,如果远程方式则写成php-fpm主机的ip
(3)fcgi的目录名字可不相同,但是资源文件必须存在

   #ProxyPass /phpinfo.php  fcgi://127.0.0.1:9000/data/htdoc/dySource/phpinfo.php #代理phpinfo.php单个URL资源

   ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/phpFile/dySource/$1  

   #ProxyPassMatch ^/(pm-status|ping)$ fcgi://127.0.0.1:9000/phpFile/dySource/$1   #代理status、和ping,独立存放

</VirtualHost>

#重载配置
systemctl reload httpd.service
  • php-fpm单独运行在另一台主机

#在httpd主机创建虚拟Server
vim /etc/httpd/conf.d/vh_fpm.conf

<VirtualHost *:80>
   DocumentRoot "/data/htdoc/vh_fpm"    
   ServerName www.fpm.com
   DirectoryIndex index.html index.php     #主页检测
   <Directory "/data/htdoc/vh_fpm">
       ……
   </Directory>

   ProxyRequests Off                      #关闭httpd的正向代理

(1)所有.php资源,通过 mod_proxy_fcgi 转发的代理,使用 fastCGI 协议,转到 PHP-FPM 监听的端口
(2)10.1.249.65远程php-fpm主机的ip
(3)fcgi的目录名字可不相同,但是资源文件必须存在

   ProxyPassMatch ^/
(.*\.php(/.*)?)$ fcgi://10.1.249.65:9000/phpFile/dySource/$1  

   #ProxyPassMatch ^/(pm-status|ping)$ fcgi://10.1.249.65:9000/phpFile/dySource/$1   #代理status、和ping,独立存放
</VirtualHost>

#在php-fpm主机修改配置文件
vi /etc
/php.ini
   data.timezone = Asia/
Shanghai

vi /etc/php-fpm.d/www.conf
   listen = 10.1.249.65:9000        #本机可用ip,实现带宽均衡
   listen.allow_clients = 10.1.253.29,10.1.249.65     #远程与本机均允许
   user = nobody                    #nobody身份建立连接池
   group = nobody
   pm.status_path = /fpm-status     #启用status
   ping.path = /ping
       

mkdir /var/lib/php/session                      #创建session目录
chown -R nobody:nobody /var/lib/php/session     #赋予nobody可写权限

chmod 660 /data/htdoc/vh_fpm                    #nobody可访问资源
chown -R .nobody /data/htdoc/vh_fpm

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
补充:没有设置data.timezone时的错误情况:
tail -f /var/log/php-fpm/www-error.log
Warning:  phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone in php.ini
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#重载配置
systemctl reload httpd.service

  • 测试pm-status,查看连接池状态信息

http://ip/ping              #是否正常响应
http://ip/pm-status
http://ip/pm-status?html
http://ip/pm-status?json
http://ip/pm-status?xml
   pool:                 www
   process manager:      dynamic
   start time:           26/Sep/2016:15:10:26 +0800
   start since:          7485  
   accepted conn:        7     #已处理的请求数
   listen queue:         0
   max listen queue:     0     #等待队列长度
   listen queue len:     128   #socket等待队列的最大长度
   idle processes:       4     #空闲进程数
   active processes:     1     #活动进程数
   total processes:      5     #
   max active processes: 1     #pool中最大活跃进程数
   max children reached: 0     #pool满载次数
   slow requests:        0     #慢请求的数量

http://ip/pm-status?full        #包括每个子进程显示信息
   pid:                  33097
   state:                Running               #idle、running
   start time:           26/Sep/2016:15:10:26 +0800
   start since:          8017
   requests:             3                     #处理过的请求数量
   request duration:     154                   #处理时常
   request method:       GET  
   request URI:          /pm-status?full       #处理的URL
   content length:       0                 #请求内容长度,POST方法才有意义
   user:                 -
   script:               -             #php脚本如/dySource/phpinfo.php
   last request cpu:     0.00              #最近一次请求消耗的CPU
   last request memory:  0
  • 配置phpinfo页面

vi /var/www/html/phpinfo.php

   <?php
       phpinfo();                 #
   ?>

#重载httpd配置文件,Browser访问
systemctl reload httpd.service
http://host/phpinfo.php

httpd-2.2配置fcgi

httpd-2.2默认没有自带fcgi模块;php-5.3.3-默认不支持fpm,需要打补丁;

#需配置fedora-epel的yum源才有mod_proxy_fcgi程序
yum install httpd mod_proxy_fcgi php-fpm php-mysql mysqld-server

php-xcache

Xcache是php最为常用的加速器,作为php的模块/usr/lib64/php/modules/xacxhe.so,针对php的动态资源在速度上提升2-3倍,其原理是把执行php程序四个步骤生成的opcode缓存起来,客户端请求discuzX可明显提升响应速度。

另外,其它的php加速器还有APC、eAccelerator等

yum -y install php-xcache
rpm -ql php-xcache
   xcache.so
   xcache.ini
   doc...

vim /etc/php.d/xcache.ini
   xcache.admin.enable_auth = On  #admin程序管理fpm

   xcache.shm_scheme
   xcache.size             #opcode的缓存
   xcache.slots            #缓存块大小
   xcache.ttl              #ttl,过期清理,LRU算法
   xcache.gc_interval      #默认缓存满才清理

#使用phpinfo或DiscuzX程序测试
systemctl restart httpd.service

MySQL

MySQL数据库在Centos 6中的版本为5.1,停留在Oracle的收购之前,而在Centos 7上采用Mariadb数据库,它是MySQL的一个分支,完全兼容MySQL,只是未采用插件式存储引擎。

  1. C/S架构: 
    Server:mysqld, mysqld_safe, mysqld_multi 
    Client:mysql,使用mysql协议连接只mysql-server

  2. Centos6:mysql-server, mysql

  3. Centos7:mariadb-server, mariadb

安装与配置

yum -y install mariadb-server mariadb       #6上为mysql-server、mysql
  • MySQL、MariaDB配置文件/etc/my.cnf, /etc/my.cnf.d/*.cnf,是ini风格的 
    rpm -ql mariadb

# 跳过主机名解析,只判断ip地址,以免造成连接慢
#在mysqld或mysqld_safe添加都可
vi /etc/my.cnf
   skip_name_resolve = ON
   innodb_file_per_table = ON           #单独的表空间
  1. 启动mysql-server,查看端口,进程

    systemctl start mariadb.service
   ss -tnlp | grep mysqld               #侦听端口3306
   ps aux | grep mysqld
  1. 首次安装增强MySQL的安全设置(密码为空)

mysql_secure_installation
   Enter current password for root (enter for none):    
   Set root password? [Y/n] Y
   Remove anonymous users? [Y/n] Y
   Disallow root login remotely? [Y/n] n
   Remove test database and access to it? [Y/n] n
   Reload privilege tables now? [Y/n] y
#再次登录
mysql -p ****       #省略管理员

  1. 客户端连接mysql-server,默认MySQL管理员为root,密码为空

mysql的用户账户格式 
user@host,该user只能在@ip .. , ip/24 , 10.1.%.% , localhost 
注意: 
主机名与ip被标识为不同的属性,不能通用 
当ip反解为主机名时,如果主机名未被授权,即使ip允许登录,也不能登录

>mysql         #连接mysql,默认为root,可省略
>use mysql     #选择mysql这个数据库
>SELECT user,host,password FROM user;    
MariaDB [mysql]> SELECT user,host,password FROM user;
   +------+-------------------+----------+
   | user | host              | password |
   +------+-------------------+----------+
   | root | localhost         |          |  #管理员没有密码
   | root | cent7.localdomain |          |
   | root | 127.0.0.1         |          |
   | root | ::1               |          |
   |      | localhost         |          |  #不安全的匿名用户
   |      | cent7.localdomain |          |
   +------+-------------------+----------+
  1. mysql命令 
    此处仅做简单的总结,后期更有详细说明。

man mysql           
mysql [options] db_name
   mysql -hHOST
         -uUSERNAME
         -pPASSWORD
   mysql -h10.1.2.2 -uroot -p

#客户端命令
   mysql help 或 \?

#服务端命令
   DDL:CREATE、ALTER、DROP
       CREATE DATABASE db_name     #创建数据库              
       DROP DATABASE db_name       #销毁数据库

   DML:INSERT、DELETE、UPDATE、SELECT

   GRANT、REVOKE            #授权用户,dbname.table可使用 * 通配符
       GRANTE ALL [PRIVILEGES] ON dbname.tbl TO 'user'@'host' IDENTIFIED BY 'password'

   FLUSH PRIVILEGES        #生效授权
  1. 忘记MySQL密码

vi /etc/my.cnf
   skip_grant_tables
systemctl restart mariadb.service

mysql
>update user set password=password('****') where user="root";
>\q

vi /etc/my.cnf 去除skip_grant_tables

php –> MySQL

yum -y install php-mysql
rpm -ql php-mysql           #有3种不同的模块,供程序员使用
  • php连接MySQL

vim /var/www/html/php_mysql.php
   <?php
       $flag = mysql_connect('127.0.0.1','root','****');
       if ($flag)
           echo 'success.';
       else
           echo 'failure.';
   ?>
  • 重启httpd服务,访问测试

systemctl restart httpd.service
curl http://127.0.0.1/php_mysql.php

快速部署LAMP

yum -y install httpd mysql-server mysql php php-mysql php-xcache 
yum -y install httpd mariadb-server mariadb php php-mysql php-xcache

vim /etc/my.cnf 
skip_name_resolve = ON 
innodb_file_per_table = ON

systemctl start mariadb.service 
mysql_secure_installation

systemctl start httpd

php网站程序安装

有如wordpress、discuzX、phpwind、drupal、

phpMyadmin

  • 解压phpMyAdmin程序

uzip phpMyAdmin-4.4.14.1.zip    
mv phpMyAdmin-4.4.14.1-all-languages /var/www/html/     #升级不换号
ln -s phpMyAdmin-4.4.14.1-all-languages/  pmn          
  • 打开config文件,填入随机码

cd pmn
mv config.sample.inc.php config.inc.php     #放在站点目录下

(1)openssl rand -hex 10         #10位hex随机数
(2)vim config.inc.php
   $cfg['blowfish_secret'] = '745bf4dad49a18bc8e1c';  #填入随机数
  • 安装php语言扩展包

yum -y install php-mbstring

否则:

mbstring.jpg

https-pma.jpg

wordpress

  • 解压wordpress-4.3.1-zh_CN.zip程序,给apache用户授权

unzip -q -o ./src/wordpress-4.3.1-zh_CN.zip -d $DocumentRoot/wordpress/
ln -sf $DocumentRoot/wordpress/wordpress/* $DocumentRoot/wordpress/

chown apache -R $DocumentRoot/wordpress/
  • 创建数据库,授权给discuzX管理员

mysql -uroot -p -e 'CREATE DATABASE blog;GRANT ALL ON blog.* TO "blog-admin"@"localhost" IDENTIFIED BY "blogpass"'
  • 创建虚拟主机,授权站点资源

<VirtualHost *:80>
ServerName www.wordpress.com
DocumentRoot "/data/htdoc/wordpress"
<Directory "/data/htdoc/wordpress">
  Options FollowSymLinks
  AllowOverride None
  Require all granted
</Directory>
ErrorLog "logs/wordpress-error-log"
CustomLog "logs/wordpress-access-log" combined
</VirtualHost>

wordpress.jpg

DiscuzX

  • 解压Discuz_X3.2_SC_UTF8.zip程序,给apache用户授权

unzip -q -o ./src/Discuz_X3.2_SC_UTF8.zip -d $DocumentRoot/discuz/
ln -sf $DocumentRoot/discuz/upload/* $DocumentRoot/discuz/

chowm -R apache date/ uc_client/ uc_server/ config/
  • 创建数据库,授权给discuzX管理员

mysql
>CREATE DATABASE ultrax;
>GRANT ALL ON ultrax.* TO 'ultraxuser'@'localhost' IDENTIFIED BY 'ultraxpass';
>FLUSH PRIVILEGES;
>SHOW database;
  • 创建虚拟主机,授权站点资源

<VirtualHost *:80>
ServerName www.mydiscuz.com
DocumentRoot "/data/htdoc/discuz"
<Directory "/data/htdoc/discuz">
  Options FollowSymLinks
  AllowOverride None
  Require all granted
</Directory>
ErrorLog "logs/discuz-error-log"
CustomLog "logs/discuz-access-log" combined
</VirtualHost>

discuzX.jpg

脚本安装wordpress、discuzX、drupal、https – phpMyAdmin

  • 关于脚本,由于内容较多,此处不便展示,如投你所好,欢迎来取。

install_scr.jpg

  • 启动界面,略丑

install.jpg

  • 安装wordpress

install_wd.jpg

  • 安装discuzX

install_ds.jpg

原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/51895

(1)
hellochelloc
上一篇 2016-10-12
下一篇 2016-10-12

相关推荐

  • gitlib环境部署

         GitLab是利用 Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松…

    2016-05-19
  • Linux下编译安装httpd

    本章学习内容         ———介绍httpd         ———-rpm和yum不同   &nbs…

    Linux干货 2016-08-25
  • 基于iptables mangle的lvs && lvs的持久连接

    一、lvs-dr类型:也称direct routing,简称为g(gatewaying);配置lvs-dr基于iptables mangle的实现方式  实验图:  地址规划:    VIP: 172.16.2.100    DIP: 172.16.2.13    RIP1:17…

    Linux干货 2015-06-30
  • 进程和优先级

         什么是进程?我们先来了解一下进程的概念:我们知道操作系统最核心的概念就是进程。进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。但是进程是一个动态的实体,它是程序的一次执行过程。进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码。    当多个任务要执行时怎么办呢?先执行…

    2017-09-09
  • 20161028第9天作业

    20161028第9天作业 1、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问” 2、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率率,如果超过80%,就发广播…

    Linux干货 2016-10-30