實現LAMP架構 PHP 和日誌管理

LAMP介紹

LAM(M)P:
L:linux
A:apache (httpd)
M:mysql, mariadb
M:memcached
P:php, perl, python
WEB資源類型:
靜態資源:原始形式與響應內容一致,在客戶端瀏覽器執行
動態資源:原始形式一般爲程序文件,須要在服務器端執行以後,將執行結果返回給客戶端
Web相關語言
客戶端技術: html,javascript,css,jpg
服務器端技術:php, jsp,python,aspjavascript

CGI

CGI:Common Gateway Interface
可讓一個客戶端,從網頁瀏覽器經過http服務器向執行在網絡服務器上的程序傳輸數據;CGI描述了客戶端和服務器程序之間傳輸的一種標準
請求流程:
Client -- (http) --> httpd -- (cgi) --> application server (program file) -- (mysql) --> mysql
php: 腳本編程語言、嵌入到html中的嵌入式web程序語言
基於zend編譯成opcode(二進制格式的字節碼,重複運行,可省略編譯環境)php

LAMP工做原理

PHP Zend Engine

Zend Engine是開源的、PHP腳本語言的解釋器,它最先是由以色列理工學院(Technion)的學生Andi Gutmans和Zeev Suraski所開發,Zend也正是此二人名字的合稱。後來兩人聯合創立了Zend Technologies公司
Zend Engine 1.0於1999年隨PHP 4發佈,由C語言開發且通過高度優化,並可以作爲PHP的後端模塊使用。Zend Engine爲PHP提供了內存和資源管理的功能以及其它的一些標準服務,其高性能、可靠性和可擴展性在促進PHP成爲一種流行的語言方面發揮了重要做用
Zend Engine的出現將PHP代碼的處理過程分紅了兩個階段:首先是分析PHP代碼並將其轉換爲稱做Zend opcode的二進制格式opcode(相似Java的字節碼),並將其存儲於內存中;第二階段是使用Zend Engine去執行這些轉換後的Opcodecss

PHP的Opcode

Opcode是一種PHP腳本編譯後的中間語言,相似於Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼通常會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend)
一、Scanning 詞法分析,將PHP代碼轉換爲語言片斷(Tokens)
二、Parsing 語義分析,將Tokens轉換成簡單而有意義的表達式
三、Compilation 將表達式編譯成Opcode
四、Execution 順次執行Opcode,每次一條,從而實現PHP腳本的功能
掃描-->分析-->編譯-->執行html

php配置

php:腳本語言解釋器
配置文件:/etc/php.ini, /etc/php.d/*.ini
配置文件在php解釋器啓動時被讀取
對配置文件的修改生效方法
Modules:重啓httpd服務
FastCGI:重啓php-fpm服務
/etc/php.ini配置文件格式:
[foo]:Section Header
directive = value
註釋符:較新的版本中,已經徹底使用;進行註釋
#:純粹的註釋信息
;:用於註釋可啓用的directivejava

php設置

php.ini的核心配置選項文檔: http://php.net/manual/zh/ini.core.php
php.ini配置選項列表:http://php.net/manual/zh/ini.list.php
php常見設置:
max_execution_time= 30 最長執行時間30s
memory_limit=128M 生產不夠,可調大
display_errors=off 調試使用,不要打開,不然可能暴露重要信息
display_startup_errors=off 建議關閉
post_max_size=8M 最大上傳數據大小,生產可能調大,比下面項大
upload_max_filesize =2M 最大上傳文件,生產可能要調大
max_file_uploads = 20 同時上傳最多文件數
date.timezone =Asia/Shanghai 指定時區
short_open_tag=on 開啓短標籤,如<? phpinfo();?>node

LAMP

LAMP
httpd:接收用戶的web請求;靜態資源則直接響應;動態資源爲php腳本,對此類資源的請求將交由php來運行
php:運行php程序
MariaDB:數據管理系統
httpd與php結合的方式
modules (將php編譯成爲httpd的模塊,默認方式)
MPM:
prefork: libphp5.so
event, worker: libphp5-zts.so
FastCGIpython

實現LAMP方式

CentOS 7:
Modules:httpd, php, php-mysql, mariadb-server
FastCGI:httpd, php-fpm, php-mysql, mariadb-server
CentOS 6:
Modules:httpd, php, php-mysql, mysql-server
FastCGI:默認不支持mysql

基於php模塊方式安裝LAMP

安裝LAMP
CentOS 6:
yum install httpd, php, mysql-server, php-mysql
service httpd start
service mysqld start
CentOS 7:
yum install httpd, php, php-mysql, mariadb-server
systemctl start httpd.service
systemctl start mariadb.service
注意:要使用prefork模型linux

php代碼

php語言格式
<?php
...php code...
?>nginx


php測試代碼
<?php
echo date("Y/m/d H:i:s");
phpinfo();
?>

格式1
<?php
echo "<h1>Hello world!</h1>"
?>


格式2
<h1>
<?php echo "Hello world!" ?>
</h1>

使用mysql擴展鏈接數據庫(不建議使用該方式)

php使用mysql擴展鏈接數據庫的測試代碼
<?php
$conn = mysql_connect('mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
#echo mysql_error();
mysql_close();
?>

使用mysqli擴展鏈接數據庫(不建議使用該方式)

php使用mysqli擴展鏈接數據庫的測試代碼
<?php
$mysqli=new mysqli("mysqlserver", "username", "password");
if(mysqli_connect_errno()){
echo "Failure";
$mysqli=null;
exit;
}
echo "OK";
$mysqli->close();
?>

使用PDO(PHP Data Object)擴展鏈接數據庫

php使用pdo擴展鏈接數據庫的測試代碼1
<?php
$dsn='mysql:host=mysqlhost;dbname=test';
$username='root';
$passwd='magedu';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
?>

使用PDO擴展鏈接數據庫

php使用pdo擴展鏈接數據庫的測試代碼2
<?php
try {
$user='root';
$pass='magedu';
$dbh = new PDO('mysql:host=mysqlhost;dbname=mysql', $user, $pass);
foreach($dbh->query('SELECT user,host from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

 

PhpMyAdmin應用實現

php版本:php-5.4.16-46.el7.x86_64

PhpMyAdmin版本:phpMyAdmin-4.4.15.10-all-languages.t

 

常見LAMP應用

PhpMyAdmin是一個以PHP爲基礎,以Web-Base方式架構在網站主機上的MySQL的數據庫管理工具,讓管理者可用Web接口管理MySQL數據庫
WordPress是一種使用PHP語言開發的博客平臺,用戶能夠在支持PHP和MySQL數據庫的服務器上架設屬於本身的網站。也可把 WordPress看成一個內容管理系統(CMS)來使用
PHPWind:2003年發佈了PHPWind的前身版本ofstar,並發展成爲包含BBS、CMS、博客、SNS等一系列程序的通用型建站軟件, 於2008年加入阿里巴巴集團
Crossday Discuz! Board(簡稱 Discuz!)是一套通用的社區論壇軟件系統。自2001年6月面世以來,是全球成熟度最高、覆蓋率最大的論壇軟件系統之一。2010年8月23日,與騰訊達成收購協議
ECShop是一款B2C獨立網店系統,適合企業及我的快速構建個性化網上商店。系統是基於PHP語言及MYSQL數據庫構架開發的跨平臺開源程序。2006年6月,ECShop推出第一個版本1.0

 實驗:編譯安裝LAMP,實現多虛擬主機,一個虛擬主機博客網站blog.magedu.com 一個虛擬主機論壇網站 forum.magedu.com

 環境:兩臺主機

一臺apache+php-fpm
一臺mariadb
軟件版本:
apr-1.7.0.tar.bz2
apr-util-1.6.1.tar.bz2
httpd-2.4.39.tar.bz2
php-7.3.7.tar.xz
Discuz_X3.3_SC_UTF8.zip
wordpress-5.2.2.tar.gz
mariadb-10.2.25-linux-x86_64.tar.gz

日誌介紹

日誌:
歷史事件:時間,地點,人物,事件
日誌級別:事件的關鍵性程度,Loglevel
系統日誌服務:
sysklogd :CentOS 5以前版本
syslogd: system application 記錄應用日誌
klogd: linux kernel 記錄內核日誌
事件記錄格式:
日期時間 主機 進程[pid]: 事件內容
C/S架構:經過TCP或UDP協議的服務完成日誌記錄傳送,將分佈在不一樣主機的日誌實現集中管理

rsyslog

rsyslog特性:CentOS6和7
多線程
UDP, TCP, SSL, TLS, RELP
MySQL, PGSQL, Oracle實現日誌存儲
強大的過濾器,可實現過濾記錄日誌信息中任意部分
自定義輸出格式
ELK:elasticsearch, logstash, kibana
非關係型分佈式數據庫
基於apache軟件基金會jakarta項目組的項目lucene
Elasticsearch是個開源分佈式搜索引擎
Logstash對日誌進行收集、分析,並將其存儲供之後使用
kibana 能夠提供的日誌分析友好的 Web 界面

rsyslog介紹

術語,參見man logger
facility:設施,從功能或程序上對日誌進行歸類
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, local0-local7, syslog
Priority 優先級別,從低到高排序
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
參看幫助: man 3 syslog

rsyslog

程序包:rsyslog
主程序:/usr/sbin/rsyslogd
CentOS 6:service rsyslog {start|stop|restart|status}
CentOS 7:/usr/lib/systemd/system/rsyslog.service
配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
庫文件: /lib64/rsyslog/*.so
配置文件格式:由三部分組成
MODULES:相關模塊配置
GLOBAL DIRECTIVES:全局配置
RULES:日誌記錄相關的規則配置

RULES配置格式: facility.priority; facility.priority… target
facility:
*: 全部的facility
facility1,facility2,facility3,...:指定的facility列表
priority:
*: 全部級別
none:沒有級別,即不記錄
PRIORITY:指定級別(含)以上的全部級別
=PRIORITY:僅記錄指定級別的日誌信息
target:
文件路徑:一般在/var/log/,文件路徑前的-表示異步寫入
用戶:將日誌事件通知給指定的用戶,* 表示登陸的全部用戶
日誌服務器:@host,把日誌送往至指定的遠程服務器記錄
管道: | COMMAND,轉發給其它命令處理

啓用網絡日誌服務

一般的日誌格式:
事件產生的日期時間 主機 進程(pid):事件內容
如: /var/log/messages,cron,secure等
配置rsyslog成爲日誌服務器
#### MODULES ####
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

其它日誌

其它的日誌文件
/var/log/secure:系統安裝日誌,文本格式,應週期性分析
/var/log/btmp:當前系統上,用戶的失敗嘗試登陸相關的日誌信息,二進制格式,lastb命令進行查看
/var/log/wtmp:當前系統上,用戶正常登陸系統的相關日誌信息,二進制格式,last命令能夠查看
/var/log/lastlog:每個用戶最近一次的登陸信息,二進制格式,lastlog命令能夠查看
/var/log/dmesg:系統引導過程當中的日誌信息,文本格式
文本查看工具查看
專用命令dmesg查看
/var/log/messages :系統中大部分的信息
/var/log/anaconda : anaconda的日誌

日誌管理journalctl

Systemd 統一管理全部 Unit 的啓動日誌。帶來的好處就是,能夠只用journalctl一個命令,查看全部日誌(內核日誌和應用日誌)。日誌的配置文件/etc/systemd/journald.conf
journalctl用法
查看全部日誌(默認狀況下 ,只保存本次啓動的日誌)
journalctl
查看內核日誌(不顯示應用日誌)
journalctl -k
查看系統本次啓動的日誌
journalctl -b
journalctl -b -0
 查看上一次啓動的日誌(需更改設置)
journalctl -b -1

日誌管理journalctl

查看指定時間的日誌
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
顯示尾部的最新10行日誌
journalctl -n
 顯示尾部指定行數的日誌
journalctl -n 20
 實時滾動顯示最新日誌
journalctl -f

查看指定服務的日誌
journalctl /usr/lib/systemd/systemd
查看指定進程的日誌
journalctl _PID=1
查看某個路徑的腳本的日誌
journalctl /usr/bin/bash
查看指定用戶的日誌
journalctl _UID=33 --since today
 查看某個 Unit 的日誌
journalctl -u nginx.service
journalctl -u nginx.service --since today
實時滾動顯示某個 Unit 的最新日誌
journalctl -u nginx.service -f
合併顯示多個 Unit 的日誌
journalctl -u nginx.service -u php-fpm.service --since today

查看指定優先級(及其以上級別)的日誌,共有8級
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -p err -b
日誌默認分頁輸出,--no-pager 改成正常的標準輸出
journalctl --no-pager

以 JSON 格式(單行)輸出
journalctl -b -u nginx.service -o json
以 JSON 格式(多行)輸出,可讀性更好
journalctl -b -u nginx.serviceqq -o json-pretty
顯示日誌佔據的硬盤空間
journalctl --disk-usage
指定日誌文件佔據的最大空間
journalctl --vacuum-size=1G
指定日誌文件保存多久
journalctl --vacuum-time=1years

示例:rsyslog將日誌記錄於MySQL中

(1) 準備MySQL Server
(2) 在mysql server上受權rsyslog能鏈接至當前服務器
GRANT ALL ON Syslog.* TO 'USER'@'HOST' IDENTIFIED BY 'PASSWORD';
(3) 在rsyslog服務器上安裝mysql模塊相關的程序包
yum install rsyslog-mysql
(4) 爲rsyslog建立數據庫及表;
mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql
(5) 配置rsyslog將日誌保存到mysql中
#### MODULES ####
$ModLoad ommysql
#### RULES ####
facility.priority :ommysql:DBHOST,DBNAME,DBUSER, PASSWORD

示例:經過loganalyzer展現數據庫中的日誌

(1) 在rsyslog服務器上準備amp或nmp組合
yum install httpd php php-mysql php-gd
(2) 安裝LogAnalyzer
tar xf loganalyzer-4.1.5.tar.gz
cp -a loganalyzer-4.1.5/src /var/www/html/loganalyzer
cd /var/www/html/loganalyzer
touch config.php
chmod 666 config.php

(3) 配置loganalyzer
systemctl start httpd.service
http://HOST/loganalyzer
MySQL Native, Syslog Fields, Monitorware
(4) 安全增強
cd /var/www/html/loganalyzer
chmod 644 config.php

Logrotate日誌存儲

logrotate 程序是一個日誌文件管理工具。用來把舊的日誌文件刪除,並建立新的日誌文件,稱爲日誌轉儲或滾動。能夠根據日誌文件的大小,也能夠根據其天數來轉儲,這個過程通常經過 cron 程序來執行
配置文件是 /etc/logrotate.conf
主要參數以下
compress 經過gzip 壓縮轉儲之後的日誌
nocompress 不須要壓縮時,用這個參數
copytruncate 用於還在打開中的日誌文件,把當前日誌備份並截斷
nocopytruncate 備份日誌文件可是不截斷
create mode owner group 轉儲文件,使用指定的文件模式建立新的日誌文件

Logrotate日誌存儲

nocreate 不創建新的日誌文件
delaycompress 和 compress 一塊兒使用時,轉儲的日誌文件到下一次轉儲時才壓縮
nodelaycompress 覆蓋 delaycompress 選項,轉儲並壓縮
errors address 專儲時的錯誤信息發送到指定的Email 地址
ifempty 即便是空文件也轉儲,是缺省選項。
notifempty 若是是空文件的話,不轉儲
mail address 把轉儲的日誌文件發送到指定的E-mail 地址
nomail 轉儲時不發送日誌文件
olddir directory 轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統
noolddir 轉儲後的日誌文件和當前日誌文件放在同一個目錄下

prerotate/endscript 在轉儲之前須要執行的命令能夠放入這個對,這兩個關鍵字必須單獨成行
postrotate/endscript 在轉儲之後須要執行的命令能夠放入這個對,這兩個關鍵字必須單獨成行
daily 指定轉儲週期爲天天
weekly 指定轉儲週期爲每週
monthly 指定轉儲週期爲每個月
size 大小 指定日誌超過多大時,就執行日誌轉儲
rotate count 指定日誌文件刪除以前轉儲的次數,0 指沒有備份,5 指保留5 個備份
Missingok 若是日誌不存在,提示錯誤
Nomissingok若是日誌不存在,繼續下一第二天志,不提示錯誤

實驗:編譯安裝LAMP,實現多虛擬主機,一個虛擬主機blog.magedu.com 一個虛擬主機 forum.magedu.com
環境:兩臺主機
一臺apache+php-fpm
一臺mariadb
軟件版本:
apr-1.7.0.tar.bz2
apr-util-1.6.1.tar.bz2
httpd-2.4.39.tar.bz2
php-7.3.7.tar.xz
Discuz_X3.3_SC_UTF8.zip
wordpress-5.2.2.tar.gz
mariadb-10.2.25-linux-x86_64.tar.gz

 

實驗:實現日誌web展現經過loganalyzer展現數據庫中的日誌

 

相關文章
相關標籤/搜索