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资源的概念:
-
静态资源:原始形式与响应给客户端的结果一致,如jpeg,html,plaintext,占80%
-
动态资源:原始形式通常为程序文件,需运行对应环境的子进程返回执行结果,占20%.但需要IO请求的资源大约为20%.
-
amp的工作过程
-
静态资源:Client –> http –> httpd (IO操作)
-
php动态资源:Client –> http –> httpd –> libpphp5.so (IO操作,php-mysql) –> mysql –> mysqld
-
如此一来,动态资源的响应时间慢于静态资源的访问,一般静态资源占比例为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的结合方式主要有三种:
-
CGI:由php解释器与httpd通过CGI通信
-
Module:不同的mpm需要不同的php程序包,无法混用
prefork:libphp程序包
worker, event:libphp-zts程序包 -
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的配置文件
-
ini
:php解释器工作环境的配置文件:/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
-
conf
:fpm守护进程的配置文件:/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 种:
ProxyPass
ProxyPassMatch
带 [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,只是未采用插件式存储引擎。
-
C/S架构:
Server:mysqld, mysqld_safe, mysqld_multi
Client:mysql,使用mysql协议连接只mysql-server -
Centos6:mysql-server, mysql
-
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 #单独的表空间
-
启动mysql-server,查看端口,进程
systemctl start mariadb.service
ss -tnlp | grep mysqld #侦听端口3306
ps aux | grep mysqld
-
首次安装增强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 **** #省略管理员
-
客户端连接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 | |
+------+-------------------+----------+
-
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 #生效授权
-
忘记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-xcachevim /etc/my.cnf
skip_name_resolve = ON
innodb_file_per_table = ONsystemctl start mariadb.service
mysql_secure_installationsystemctl 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
否则:
-
重载httpd配置,测试phpMyAdmin功能
https://10.1.x.x/pmn
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>
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>
脚本安装wordpress、discuzX、drupal、https – phpMyAdmin
-
关于脚本,由于内容较多,此处不便展示,如投你所好,欢迎来取。
-
启动界面,略丑
-
安装wordpress
-
安装discuzX
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/51895