#lamp
lamp是最強大的網站解決方案
lamp指的linux(作業系統)、apachehttp 伺服器,mysql(有時也指mariadb,資料庫軟體) 和php(有時也是指perl或python) 的第一個字母,一般用來建立web應用平台。
##
linux httpd mariadb php php-xcache
a: httpd
m: mysql或mariadb
p: php/perl/python/ruby
xcache
快速而且穩定的php opcode緩存,經過嚴格測試且被大量用于生産環境。項目位址,http://xcache.lighttpd.net/
##httpd
web服務端主應用程式
服務端口号:http:80 https:443
啟動服務指令:c6 service httpd start c7 systemctl start httpd
ipc inter-process communication
一次完整的http請求的處理過程:
(1) 建立或處理連接配接:接收請求或拒絕請求;
(2) 接收請求:接收用戶端發來的具體請求封包;
(3) 處理請求:對請求封包進行解析;
(4) 通路資源:通過存儲io擷取使用者請求的資源;
(5) 建構響應封包:
(6) 發送響應封包 :
(7) 記錄于日志中:
高度子產品化:core + modules
dso: dynamic shared objects
支援動态裝載和解除安裝;
mpm:multipath processing modules
prefork:一個主程序,多個子程序;一個程序響應一個請求;
主程序:管理子程序;建立套接字;接收使用者請求,并派發給某子程序處理;...
子程序:處理請求、響應請求;
worker:多程序多線程模型;一個線程響應一個請求;
子程序:負責管理線程;
線程:處理并響應請求;
event:事件驅動模型,多程序模型,每個程序響應多個請求;
子程序:處理并響應請求;
切換子產品方法
c6:/etc/sysconfig/httpd httpd=/usr/sbin/httpd.worker
c7:include conf.modules.d/*.conf /etc/httpd/conf.moudles.d 00-mpm.conf
loadmodule mpm_worker_module modules/mod_mpm_worker.so
httpd-2.2:event為測試模型;
centos 6:mpm不支援dso機制;
httpd-2.4:production ready;支援dso機制;
centos 7:
###配置檔案:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/http.conf
主要選項
####section 1: global environment
serverroot "/etc/httpd"
alias /p_w_picpaths/ "/web/p_w_picpaths/" 别名 通過定義别名 經查找的url定位到指定路徑
pidfile run/httpd.pid 存放程序pid号c6:6204 c7 48521
receives and sends time out:timeout 60
keepalive on
maxkeepaliverequests 100 最大同時連接配接數量0為不限制
keepalivetimeout 15
keepalivetimeout 500ms(c7 毫秒級限制)
listen 172.16.174.170:80 監聽在ip:80端口下
loadmodule foo_module modules/mod_foo.so:動态的裝載子產品dso:dynamic shared object (dso)
extendedstatus on server-status 頁面加載額外資訊
user apache
group apache
typesconfig /etc/mime.types mime類型
loadmodule deflate_module modules/mod_deflate.so 使用mod_deflate子產品壓縮頁面優化傳輸速度
适用場景:
(1) 節約帶寬,額外消耗cpu;同時,可能有些較老浏覽器不支援;
(2) 壓縮适于壓縮的資源,例如檔案檔案;
setoutputfilter deflate
# mod_deflate configuration
# restrict compression to these mime types
addoutputfilterbytype deflate text/plain
addoutputfilterbytype deflate text/html
addoutputfilterbytype deflate application/xhtml+xml
addoutputfilterbytype deflate text/xml
addoutputfilterbytype deflate application/xml
addoutputfilterbytype deflate application/x-javascript
addoutputfilterbytype deflate text/javascript
addoutputfilterbytype deflate text/css
# level of compression (highest 9 - lowest 1)
deflatecompressionlevel 9
# netscape 4.x has some problems.
browsermatch ^mozilla/4 gzip-only-text/html
# netscape 4.06-4.08 have some more problems
browsermatch ^mozilla/4\.0[678] no-gzip
# msie masquerades as netscape, but it is fine
browsermatch \bmsi[e] !no-gzip !gzip-only-text/html
####section 2: 'main' server configuration
servername www.deardy.com:80 開啟設定後啟動服務時不會提示
documentroot "/data/web" 預設網站檔案的預設根路徑
directoryindex index.html test.html 網站中的預設通路頁
accessfilename .htaccess 不建議設定 極具的影響性能
redirect permanent /foo http://www.example.com/bar 永久重定向
adddefaultcharset utf-8 預設字元集
權限限制:
限制檔案夾的通路權限,并通過ip及使用者認證進行限制
#<directory "/data/web/admin">
# options none
# allowoverride none
# authtype basic #認證類型 還可以基于digest
# authname "for administrators" #認證時提示的資訊
# authuserfile "/etc/httpd/conf/.htpasswd" 使用者認證的密碼檔案可以htpasswd -c(建立)-m (md5)/etc/httpd/conf/.htpasswd username
# authgroupfile "/etc/httpd/conf/.htgrps" 使用者組檔案:vim一個名叫.htgrps 檔案即可 格式:mygrp(組名): user1 (空格)user2
# require valid-user/ group mygrps
#</directory>
通過ip認證
c6:order allow,deny
allow from 172.16.0.0/16
deny from 172.16.174.100 比對原則 基于最佳原則 比對較小的
c7:<requireall>
require ip 172.16.100.67
require all denied
</requireall>
控制特定的用戶端ip位址通路:
require ip ipaddr:授權
require not ip ipaddr:拒絕
require all granted
控制特定的主機名通路:
require host hostname
require not host hostname
hostname:
fqdn:單個主機名
domain.tld:域名内的所有主機
限制url的通路
<location /server-status>
其他同上
</location>
基于檔案的通路限制方法
<files ~ "^\.ht">
order allow,deny
deny from all
satisfy all
</files>
可以支援的類型
typesconfig /etc/mime.types
錯誤日志
errorlog logs/error_log loglevel warn
logformat "%h %l %u %t \"%r\" %>s %b \"%{referer}i\" \"%{user-agent}i\"" combined
logformat "%h %l %u %t \"%r\" %>s %b" common
logformat "%{referer}i -> %u" referer
logformat "%{user-agent}i" agent
格式:
%h remote host
%l remote logname (from identd, if supplied).
%u remote user (from auth; may be bogus if return status (%s) is 401)
%t time the request was received (standard english format)
%r first line of request
%s status. for requests that got internally redirected, this is the status of the *original* request --- %>s for the last.
%b size of response in bytes, excluding http headers.
%{foobar}i the contents of foobar: header line(s) in the request sent to the server.
通路日志
customlog logs/access_log combined #必須定義格式
虛拟主機
#### section 3: virtual hosts
可以使基于 ip 端口 fqdn的類型 最常用的為基于fqdn
執行個體配置:
打開虛拟主機設定:namevirtualhost 172.16.174.170:80
vim /etc/httpd/conf.d/user1.conf
<virtualhost 172.16.174.170:80>
servername user1.magedu.com
documentroot /data/vhost/user1
customlog logs/access_user1_log combined
errorlog logs/error_user1_log
<loction /server-status>
sethandler server-status
options none
allowoverride none
authtype basic
authname "for administrators"
authuserfile "conf/.htpasswd"
authgroupfile "conf/.htpsswd"
require group mygrps
</virtualhost>
(2)實作運作tom 檢視/server-status資訊
htpasswd -m /etc/conf/.htpasswd tom
輸入密碼mageedu
在組檔案中添加tom vim/etc/httpd/conf/,htgrps 組名:組成員 mygrps:wang 空格 tom
必須有mod_status子產品 可以添加 extendedstatus on 看額外資訊
(3)不允許192.168.0.0/24任何主機通路 添加 基于ip的通路控制
<directory />
options none
allowoverride none
order allow,deny
allow from 172.16.0.0/16
deny from 192.168.0.0/24
</directory>
##配置httpd支援https:
(1) 為伺服器申請數字證書;
測試:通過私建ca發證書
(a) 建立私有ca
(b) 在伺服器建立證書簽署請求
(c) ca簽證
(2) 配置httpd支援使用ssl,及使用的證書;
# yum -y install mod_ssl
配置檔案:/etc/httpd/conf.d/ssl.conf
documentroot
servername
sslcertificatefile /etc/pki/tls/certs/httpd.crt
sslcertificatekeyfile /etc/pki/tls/private/httpd.key
本地生成httpd.key私鑰:
(umask 077;openssl genrsa -out httpd.key 1024 )
向ca請求頒發證書:
openssl req -new -key httpd.key -out httpd.csr -days 365
(3) 測試基于https通路相應的主機;
# openssl s_client [-connect host:port] [-cert filename] [-capath directory] [-cafile filename]
##php
動态資源技術伺服器端響應程式;腳本程式設計語言、專為web開發而設計、将代碼嵌入到html中
php的源碼在結構上非常清晰。其代碼根目錄中主要包含了一些說明檔案以及設計方案,并提供了如下子目錄:
1、build —— 顧名思義,這裡主要放置一些跟源碼編譯相關的檔案,比如開始建構之前的buildconf腳本及一些檢查環境的腳本等。
2、ext —— 官方的擴充目錄,包括了絕大多數php的函數的定義和實作,如array系列,pdo系列,spl系列等函數的實作。 個人開發的擴充在測試時也可以放到這個目錄,以友善測試等。
3、main —— 這裡存放的就是php最為核心的檔案了,是實作php的基礎設施,這裡和zend引擎不一樣,zend引擎主要實作語言最核心的語言運作環境。
4、zend —— zend引擎的實作目錄,比如腳本的詞法文法解析,opcode的執行以及擴充機制的實作等等。
5、pear —— php 擴充與應用倉庫,包含pear的核心檔案。
6、sapi —— 包含了各種伺服器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等接口。
7、tsrm —— php的線程安全是建構在tsrm庫之上的,php實作中常見的*g宏通常是對tsrm的封裝,tsrm(thread safe resource manager)線程安全資料總管。
8、tests —— php的測試腳本集合,包含php各項功能的測試檔案。
9、win32 —— 這個目錄主要包括windows平台相關的一些實作,比如sokcet的實作在windows下和*nix平台就不太一樣,同時也包括了windows下編譯php相關的腳本。
web資源的類型:
靜态資源:原始形式與響應結果一緻;
動态資源:原始形式通常為程式檔案,需要運作後将運作結果呈現給使用者;
用戶端技術:js
伺服器端技術:php, jsp
cgi:common gateway interface(協定)
通過cgi調用支援cgi接口的應用程式,并讓其加載到指定的程式檔案,完成程式執行,并将資料放回給前端httpd
注:伺服器端(httpd)可以通過使用者請求的url字尾名判斷是動态資源還是靜态資源,然後進行處理;如果是靜态資源自給處理,動态資源将啟動解釋器(perl)進行執行加載處理(加載執行動态資源,如果涉及到資料讀取還要連接配接到資料庫),傳回給(httpd),httpd将傳回給強求的用戶端。有
可以讓一個用戶端,從用戶端代理向運作在網絡伺服器上程式傳輸資料;cgi描述了用戶端和伺服器程式之間傳輸資料的一種标準;
請求流程:
client --(http) --> httpd --> (cgi) --> application process (code) --> (mysql) --> mysqld (mariadb)
httpd與php結合方式:
靜态資源:client -- http --> httpd
動态資源:client -- http --> httpd --> libphp5.so ()
動态資源:client -- http --> httpd --> libphp5.so () -- mysql --> mysql server
cgi: httpd 啟動一個子程序
module (把php編譯成為httpd的擴充子產品)
mpm:
prefork: libphp5.so
event, worker: libphp5-zts.so
fastcgi:
fpm fast process manager
其像prefork worker event 一樣 生成套接字服務 可以通用開啟幾個程序最多空閑的程序等等。
相當于反代程式(模糊)
lamp的實作方式:
httpd(prefork)+libphp5.so+mysql
httpd(event)+libphp5-zts.so+mysql
httpd+fpm(php)+mysql
centos 6:
mysql-server-5.1
centos 7
mariadb-server-5.5
php的安裝:
httpd(prefork)
# yum install php
(phplib5.so)
配置檔案:
/etc/php.ini, /etc/php.d/*.ini
配置檔案在php解釋器啟動時被讀取,是以,對配置檔案的修改如何生效?
modules:重新開機httpd服務;
fastcgi:重新開機php-fpm服務;
ini:
[foo]:section header
directive = value
注釋符:較新的版本中,已經完全使用;進行注釋;
#:純粹的注釋資訊
;:用于注釋可啟用的directive
php.ini的核心配置選項文檔: http://php.net/manual/zh/ini.core.php
php.ini配置選項清單:http://php.net/manual/zh/ini.list.php
測試php:
<?php
phpinfo();
?>
centos 6:
# yum install httpd php php-mysql mysql-server
# service mysqld start
# service httpd start
centos 7:
# yum install httpd php php-mysql mariadb-server
# systemctl start mariadb.service httpd.service
測試mysql連接配接性:
<?php
$conn = mysql_connect('172.16.100.71','testuser','testpass');
if($conn)
echo "ok";
else
echo "failure";
##php:程式設計語言;普遍需求,通用的功能子產品;擴充,extensions;
程式:分解多個包
主包:php-5.3.3-
支包:name-subname-version-release.rpm
epel:
性能擴充方式:
向上擴充:scale up
向外擴充:scale out
httpd與php結合方式:
cgi:common gateway interface
module:php,編譯成httpd的擴充子產品;
prefork:libphp5.so
worker, event:libphp5-zts.so
fastcgi:c/s架構,socket;
php-fpm:
httpd-2.2:預設不支援fcgi子產品,需要自行編譯擴充;
php-5.3.3:不支援fpm機制,需要自行打更新檔編譯安裝;
lamp的實作方式:
httpd(prefork)+libphp5.so+mysql
httpd(event)+libphp5-zts.so+mysql
httpd+fpm(php)+mysql
##mysql的指令行用戶端程式:mysql
-uusername
-hhost
-ppassword
支援sql語句對資料完成管理:
ddl,dml
ddl:create, alter, drop
dml:insert,delete,select,update
mysql> grant all on db_name.tbl_name to username@'host' identified by 'password';
_:任意單個字元
%:任意長度的任意字元
管理者賬号:root/localhost, 密碼預設為空;
配置檔案:/etc/my.cnf, /etc/my.cnf.d/*.cnf
[mysqld]
innodb_file_per_table = on
skip_name_resolve = on
datadir=/var/lib/mysql
添加字元集
安裝完成後,建議運作 mysql_secure_installation一次;
##解決方案:編譯安裝httpd-2.4, php-5.3.3+
httpd-2.4:rpm包預設編譯安裝了fcgi子產品;
php-fpm:php-fpm-version.rpm包
配置檔案:
服務程序配置檔案:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf
解釋器配置檔案:/etc/php.ini, /etc/php.d/*.ini
服務程序配置檔案:
[global]:全局配置
[pool]:連接配接池配置
listen = 127.0.0.1:9000
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
user =
group =
pm = dynamic|static
pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests
pm方式的php程序存儲session的路徑:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
# mkdir /var/lib/php/session
# chown apache.apache /var/lib/php/session
配置示例:
<virtualhost *:80>
servername www1.magedu.com
documentroot /data/vhosts/www1
proxyrequests off
directoryindex index.php
proxypassmatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/vhosts/www1/$1
<directory "/data/vhosts/www1">
options none
allowoverride none
require all granted
</directory>
</virtualhost>
##編譯安裝amp:
httpd:httpd-2.4
mariadb:mariadb-5.5
php5:php-5.4
注意:被依賴到的每個元件,在編譯時主要用到的是其開發庫和頭檔案;通常由name-devel-version.rpm;
開發包組:development tools, server platform development
centos 6專用:
(1) apr
# ./configure --prefix=/usr/local/apr
# make && make install
(2) apr-util
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
centos 7專用:
# yum install apr-devel apr-util-devel
安裝httpd-2.4:
# yum install pcre-devel openssl-devel libevent-devel
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-pcre --with-zlib --with-apr=/usr --with-apr-util=/usr
# make -j #
# make install
安裝php-5.4:
# yum install libxml2-devel gd-devel freetype-devel libmcrypt-devel
# ./configure --prefix=/usr/local/php54 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --enable-xml --enable-sockets --with-freetype-dir --with-gd --with-libxml-dir=/usr --with-zlib --with-jpeg-dir --with-png-dir --with-mcrypt --with-apxs2=/usr/local/apache24/bin/apxs --with-config-file-path=/etc/php54.ini --with-config-file-scan-dir=/etc/php54.d
# make -j #
# make install
注意:如果httpd使用了線程式mpm,則編譯php時應該額外使用--enable-maintainer-zts;
配置httpd:
loadmodule php5_module modules/libphp5.so
addtype application/x-httpd-php .php
directoryindex index.php index.html
部署phpmyadmin:
web gui,用于管理mysql資料庫;
##編譯amp:
httpd-2.4, php-5.5.40, mariadb-5.5.46
lamp(4):
opcode加速器:
apc,eaccelerator, xcache, ...
并不是優化了性能;而是通過緩存opcode可供多程序共享;
xcache:
http://xcache.lighttpd.org
# /usr/local/php54/bin/phpize
# ./configure --enable-xcache --with-php-config=/usr/local/php54/bin/php-config
# mkdir /etc/php54.d/
# cp xcache.ini /etc/php54.d/