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.www58058.com/51895