LAMP架構
L:linux操做系統,常見centos
A:apche網站服務
M:mysql數據庫
P:php程序php
LAMP是一個多C/S架構的平臺,最初級爲web客戶端基於TCP/IP經過http協議發起傳送,這個請求多是動態的,也多是靜態的。
因此web服務器經過發起請求的後綴來判斷,若是是靜態的資源就由web服務器自行處理,而後將資源發給客戶端。若是是動態這時web服務器會經過CGI(Common Gateway interface)協議發起給php。
這裏可是若是php是以模塊形式與Web服務器聯繫。那麼他們是經過內部共享內存的方式。若是是php單獨的放置與一臺服務器,那麼他們是經過sockets套接字監聽的方式通訊(這又是一個C/S架構)。
這時php會相應的執行一段程序,若是在執行程序時,須要用到數據。那麼php就會經過mysql協議發送給mysql服務器(也能夠看做是一個C/S架構)。由mysql服務器處理,將數據供給php程序。html
根據上圖中訪問數據流可知,處理一次動態頁面請求,服務器主要經歷:Apache處理請求——經過CGI接口訪問PHP的的應用程序——PHP應用程序調用PHP解釋器執行PHP代碼——PHP程序訪問調用數據庫——最後給客戶作反饋
apache主要實現以下功能:
第一:處理http的請求、構建響應報文等自身服務;
第二:配置讓Apache支持PHP程序的響應(經過PHP模塊)
mariadb主要實現以下功能:
第一:提供PHP程序對數據的存儲;
第二:提供PHP程序對數據的讀取(一般狀況下從性能的角度考慮,儘可能實現數據庫的讀寫分離)。
php主要實現以下功能:
第一:創建和前端apache動態網頁的聯繫,支持處理動態頁面,動態頁面內容是php語言寫的,融合了不少java等環境組,網頁燦爛的內容是開發那邊基於java等各類語言彙編而成的
第二:也是最重要的一點,創建和後端數據庫的鏈接,當用php寫的網頁內容須要調用後端關聯數據庫如mysql裏面內容時,就須要執行php程序調用,注意關聯數據庫裏面都是字符的那種表數據,php程序只是調用數據庫內容,具體內容還須要到動態網頁文件裏面java環境組裏面處理運算優化等。前端
LAMP流程:java
A,M,P是怎麼聯動起來工做的呢:
一、apache + php結合的方式大概幾種
第一種:把php編譯時直接編譯成apache的模塊、module模塊化的方式進行工做(apahce默認的這種方式,咱們接下來的配置也是這中方式)。
第二種:CGI、通用網關接口、apache基於CGI跟hph通訊,還記得咱們在apache預編譯的時候enable --cgi-bin開啓了cgi網關程序支持擴展功能嗎,這種比價繁瑣,因此不經常使用
php是作爲一個模塊或都是php解析器運行的,是讓別人調用爲一個進程使用的,apache不會跟數據庫打交道,他是個靜態web服務器,跟數據庫打交道的是應用程序php,做爲php的驅動可以基於某個API(應用程序的接口)有點涉及到開發了這裏,跟服務器之間創建會話,然後他會經過咱們的mysql語句發送給數據庫,數據庫再將結果返回給應用程序,不是php進程,而是php進程中所執行的代碼
因此php被httpd所調用就須要在apache配置文件裏面寫一些支持php程序的語句,同時編譯成apache的模塊,那麼他的執行位置應該在/usr/local/httpdapache基目錄下
二、php + mysql的通訊
首先httpd並不具有解析代碼的能力,他要依賴於php的解析器,接着php自己不依賴於mysql,他只是一個解析器,能執行代碼就OK了,那他何時用到mysql呢,動態網頁的處理須要調用後端mysql數據庫內容,或查或增刪
php語言要想聯繫mysql,一般用到php的驅動,rpm包的叫php_mysql,php跟mysql沒有一點關係,只有程序員在php中編寫mysql語句時才鏈接mysql來執行sql語句的。
基於php-mysql驅動php去鏈接mysql只使用一個函數mysql_connect();而mysql_connect()正是php-mysql提供的一個API,只要指明要鏈接的服務器便可。mysql
接下來是具體配置項,以及詳解,apache前面已經編譯安裝好了,咱們直接從mysql數據庫和php程序講起,並結合抓包測試動態網頁深刻理解LAMP架構linux
LAMP架構配置c++
http://httpd.apache.org/download.cgi
http://apr.apache.org/download.cgi
http://mirrors.sohu.com/mysql/
http://www.php.net/downloads.php
https://www.phpmyadmin.net/
http://www.awstats.org/#DOWNLOAD程序員
-----------使用MD5校驗文件完整性-------
一、下載文件如httpd-2.4.29.tar.bz2
二、將網站上該文件的MD5值複製到文件 httpd-2.4.29.tar.bz2.md5 中
三、使用 md5sum -c httpd-2.4.29.tar.bz2.md5 校驗,若是OK就沒有問題。web
--------安裝Apache(一主兩從包)----下面兩個插件從包是httpd2.4之後的版本所須要-----
tar xf apr-1.6.2.tar.gz
tar xf apr-util-1.6.0.tar.gz //apr包是爲了緩解下降併發進程
tar xf httpd-2.4.28.tar.gz //apache主包http
mv apr-1.6.2 httpd-2.4.29/srclib/apr //包三合一
mv apr-util-1.6.0 httpd-2.4.29/srclib/apr-util
安裝apache依賴的環境語言包
yum -y install \
gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perlsql
cd httpd-2.4.29
執行apache環境的預編譯(執行基目錄下configure腳本)
./configure \
--prefix=/usr/local/httpd \ //指定服務程序的基目錄
--enable-so \ //開啓動態加載模塊,給apache後續加入各類模 塊好比php模塊等提供一個開啓開關把,不開啓動態加 載,安裝成什麼樣apache就固定死了
--enable-rewrite \ //開啓網頁的重寫功能
--enable-charset-lite \ //開啓字符集
--enable-cgi //開啓服務cgi網關擴展程序功能,好比php能夠經過cgi腳本支持運行,也能夠模塊化編譯安裝到apache的模塊下,兩種方式
make && make install //編譯make安裝make install
cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
//源碼編譯的文件systemctl(chkconfig的後生)不能識別,須要把apache的啓動文件apachect1複製到系統保存各種啓動文件的/etc/init.d下而且重命名httpd,加入到系統啓動中
vi /etc/init.d/httpd
// chkconfig:後面定義的使啓動服務的運行級別(例子中使35啓動該服務),以及 關閉和啓動服務的順序(上例中啓動服務的順序是85,關閉的順序是21)。這就是兩條註釋說明語句,定義啓動級別
執行命令:
chkconfig --add httpd
//將httpd加入到systemctl管理器中,這樣apache的啓動等由systemctl統一管理
ln -s /usr/local/httpd/conf/httpd.conf /etc/httpd.conf
ln -s /usr/local/httpd/bin/* /usr/local/bin/
//作一個apache主配置文件的軟連接到/etc/httpd.conf,作一個apache命令的軟連接到 /usr/local/bin/,方便識別系通通一管理,一個服務最重要的用的改的最多的不就是配置文件和各類程序命令文件(bin)嗎,因此作個軟連接好找
systemctl stop firewalld.service //關閉防火牆 ,若是開啓需在防火牆區域裏面開啓http服務選項
setenforce 0 //關閉內核防火牆selinux
httpd -t //檢查配置文件有沒有語法錯誤,沒有就有個OK字樣
apachectl -t
service httpd start //啓動apache
netstat -anpt | grep 80 //檢查服務是否正常運行,默認tcp80端口在監聽
-----虛擬目錄----
虛擬目錄的做用,是將WWW服務器上的某個目錄,經過apache軟件共享出去,讓相關權限的用戶能夠直接訪問目錄中的內容。(包括兩種權限,一種是匿名,一種是受權)
需求:須要全部人能夠訪問服務器上的/usr/share/doc目錄中的幫助手冊。
配置方法:見附件vdir
-----虛擬web主機-----
詳見附件:vhost-7(必定要看,很重要)
————————————————————————————————————————————————
-----------------------------以mysql數據庫簡介和安裝----------------------------------------------------
mysql:是一種關係數據庫,關係數據庫是如今應用最普遍的數據庫,和Excel 工做表同樣,它也採用由行和列組成的二維表來管理數據,簡單易懂(表1),同時,它還使用專門的SQL(Structured Query Language,結構化查詢語言)對數據進行操做
數據庫內容本質上是保存在硬盤上的,數據庫由專門管理數據庫的服務、程序RDBMS服務器管理,可是咱們安裝mysql的時候是安裝的mysql數據庫系統,服務程序都一併裝上了,因此爲了方便咱們通常就把mysql叫作mysql數據庫,其實他是一個數據庫服務系統
yum -y install \
ncurses \
ncurses-devel \
bison \
cmake
//mysql所須要的依賴的環境包,注意cmake工具,它是執行mysql預編譯的工具
useradd -s /sbin/nologin mysql
//創建一個程序形用戶專門運行服務的用戶mysql
tar xf mysql-boost-5.7.20.tar.gz
cd mysql-5.7.20/
// 解壓mysql包,解壓出來文件名叫mysql-5.7.20
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
//對mysql進行一些預編譯 ,指定mysql數據庫服務的基目錄,sock鏈接文件位置,配置文件目錄,進程文件位置,支持字符集,數據庫記錄的內容文件位置等等
mysql的兩種鏈接方式
1:TCP/IP 方式
這種方式會在TCP/IP 鏈接上創建一個基於網絡的鏈接請求,通常是client鏈接跑在Server上的MySQL實例,2臺機器經過一個TCP/IP 網絡鏈接
2:socket鏈接
對mysql.sock文件來講,其做用是客戶端與與mysqlserver服務器處於同一臺機器,發起本地鏈接時可用,說白了sock鏈接就是本身登錄本身,cs架構嗎,機器既想做爲mysqlserver的服務器端又想做爲客戶端去驗證的登錄mysql,必須有而且制定sock文件也就是mysql.sock位置
make && make install //編譯安裝
chown -R mysql.mysql /usr/local/mysql/ //遞歸讓程序用戶mysql去管理mysql服務
vi /etc/my.cnf //mysql的默認主配置文件-
===在末尾添加===
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
//這裏配置主要定義了mysql客戶端和服務器端mysqld的相關屬性,監聽端口,sock鏈接文件等字符集呀,sql_mode開啓數據庫工做的一些支持模式
chown mysql:mysql /etc/my.cnf //配置文件的屬主也改爲mysql
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile (能夠識別mysql中的命令)
echo 'export PATH' >> /etc/profile
source /etc/profile
//系統環境變量PATH中設置添加mysql命令行程序在任何shell中均可以執行,編輯/etc.profile文件讓PATH系統環境變量生效
初始化數據庫:
cd /usr/local/mysql/
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
//執行mysqlbin下面的mysqld命令,對數據庫進行一些初始化的設置,initialize-insecure,設置數據庫空密碼 。user=mysql,mysql用戶身份去初始化mysql服務,--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data,指定基目錄,數據存放目錄
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
//systemctl管理只能識別/etc/init.d下面的啓動文件,apache是吧apachect1文件複製到改目錄下還重命名新建爲httpd,這裏咱們不用新建,直接複製啓動文件腳本
systemctl daemon-reload
systemctl start mysqld
netstat -anpt | grep 3306
systemctl enable mysqld //mysql加入開機自啓動項
mysqladmin -u root -p password "abc123" //給root帳號設置密碼
//mysqladmin,安裝好後自帶的一個登錄設置先關命令mysqladmin,用來給登錄mysql數據庫的用戶設置登陸密碼-u給哪一個用戶 -p設置登陸mysql服務的密碼
登錄:
mysql -u root -p
//-p後面能夠跟密碼,這樣密碼就是明文顯示,不跟密碼,會提示你輸入密碼,密碼就是密文方式顯示
受權遠程登陸:
grant all privileges on . to 'root'@'%' identified by 'abc123' with grant option;
全部的庫都給root用戶權限,而且容許他在任何主機地方登錄,登錄時候以密碼abc123登錄
grant all privileges on 庫.表 to '用戶'@在'全部地方%‘ 密碼驗證爲 abc123 ,權限最大了的了
flush privileges; //刷新才能生效
可用navicat工具遠程管理
===================數據庫基本操做==========================
數據結構:庫---》表---》數據
mysql> show databases; //查看庫
create database school; //建立school這個庫
create table info (id int,name char(10),score decimal(5,2));
desc info; 查看錶結構
mysql> user school; 使用school這個庫,不就是進入這個庫嗎
mysql> show tables;在school庫裏去查看錶,注意mysql沒有提示符,都是mysql因此得清楚本身在哪
select * from info;
爲空!
插入數據:insert into info (id,name,score) values (1,'zhangsan',70.5);
修改數據:
update info set name='wangjiu' where id=1;
刪除數據:
delete from info where id=2;
刪除整表(庫):
drop table info;
drop database school;
-----------------如下安裝PHP-----------
yum -y install \
libjpeg \
libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 \
libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
//以上都是php程序的依賴環境組包
vi /usr/local/httpd/bin/apxs
#!/usr/bin/perl -w
//apxs是apache安裝擴展模塊的工具,它的存在能夠不須要再次執行configure腳本,執行enable-php開啓php模塊而後從新編譯安裝,apxs很好用,因此這裏咱們要安裝擴展模塊php,那麼vi這個文件,第一行加入語句#!/usr/bin/perl -w 告訴apxs工具我新擴展增長了一個模塊php,程序執行路徑爲/usr/bin/per -w,#!是unix中的符號,不止vi編輯器中的#註釋哦,要注意 -w表示寫的程序不容易出現問題,他是一種語法警告
apxs即Apache extension stool,用於把Apache編譯安裝時候沒有安裝的模塊製做成so(share object)文件,利用mod_so模塊提供的loadmodule功能把這些模塊加載進Apache,使Apache支持這些模塊的功能,固然在安裝的時候就加載這些模塊更好。
tar xjvf php-7.1.10.tar.bz2
cd php-7.1.10
./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip
//解壓這個php主包,進行環境預編譯,好比指定程序安裝的基目錄,和apache聯動,好比依賴apache的apxs擴展模塊,裏面有perl程序嗎,和mysql聯動,須要調用mysql的socket鏈接文件,還有一些依賴程序好比gd庫圖形化的庫等,enable開啓一些本身相應的模塊功能
make && make install
cp php.ini-development /usr/local/php/lib/php.ini
vi /usr/local/php/lib/php.ini
-------------加入兩句--------------
mysqli.default_socket = /usr/local/mysql/mysql.sock
date.timezone = Asia/Shanghai
//把php的模板配置文件複製到基目錄下,由於預編譯的時候指了基目錄在/usr/local/php下面,編輯php的配置文件,告訴php調用mysql數據庫的時候,若是須要用到socket鏈接,執行sock文件便可
/usr/local/php/bin/php -m //驗證安裝的模塊(看看而已)
vi /etc/httpd.conf //在mime模塊區域裏新增下面兩條語句
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
全局配置裏新增
DirectoryIndex index.php index.html
//這三句就是apache和php的聯動,告訴apache什麼樣的網頁文件能夠執行php解析器,實質就是在apache配置區域mime裏面添加能夠執行php的文件類型,mime區域就是幹這個事的,能夠解析什麼樣類型的文件,具體解析是linux調用程序是解析,好比解析php文件就是調用php程序中的phpshell解釋器,解析gzip壓縮文件就是調用linux系統中的gzip程序,好比你再加上一行「AddType application/x-httpd-php .htm」,則.htm文件也能夠被php解析器解析,你甚至還能夠添加上一行「AddType application/x-httpd-php .txt」,讓普通的文本文件格式也能運行php解析器
--------------------------------------測試php和apache的聯動-----------------------------------------------------
接下來咱們去訪問php語言寫的一個動態網頁,動態網頁裏面的展示內容是結合不少開發語法展示的,不作過多研究,只需知道php後綴的文件是動態網頁,而且它是php語言寫的,php程序模塊執行的
vi /usr/local/httpd/htdocs/index.php
<?php
phpinfo();
?>
//phpinfo();網頁主題內容調用了一個函數模塊,是展示php信息的參數的網頁
--------------------------下面測試php和數據庫的鏈接--------------------------
mysql -u root -p
CREATE DATABASE myadm;
GRANT all ON myadm. TO 'myadm'@'%' IDENTIFIED BY 'admin123';
GRANT all ON myadm. TO 'myadm'@'localhost' IDENTIFIED BY 'admin123';
flush privileges;
//建立一個myadm數據庫,而後容許myadm用戶在本機、任何地方,用密碼admin123登錄myadm數據庫的全部地方,myadm.*表示myadm數據庫下的全部內容
myadm是mysql數據庫建立好的時候自帶本地用戶,只有mysql的本地用戶,才能登錄數據庫,mysql數據庫的用戶在mysql庫中,在user表中
vi /usr/local/httpd/htdocs/index.php
<?php
$link=mysqli_connect('192.168.80.183','myadm','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
//這個動態網頁就用到了後端的數據庫,在php網頁裏面啓動鏈接數據庫的語句mysqli_connect('192.168.80.183','myadm','admin123');,這是一個函數,語句含義以什麼樣身份用戶名鏈接到哪臺主機上的mysql數據庫中,$link引用這個函數,if語句,若是函數執行成功就是php鏈接數據庫成功,那麼就會顯示success,鏈接後端數據庫不成功就會顯示fail。
---------------------------------phpmyadmin管理套件----------------------------------
phpMyAdmin 是一個使用 PHP 語言編寫,用來管理 MySQL 數據庫的 Web 程序。經過該套件提供的網頁界面,即使是對 SQL 語句不太熟悉的人,也可以很是容易地對 MySQL數據庫進行管理和維護。
理解:phpadmin是用php語言寫的程序·,能夠理解爲一個工具,是幹嗎的,以web形式圖形化簡單化管理後端mysql數據庫的一個網頁應用,一個工具。
------------------------------------如下安裝phpMyadmin----------------------------------------
unzip phpMyAdmin-4.7.6-all-languages.zip -d /opt/
//用unzip解壓指定解壓文件位置是-d參數,大多數仍是用tar解壓
mv phpMyAdmin-4.7.6-all-languages /usr/local/httpd/htdocs/myadm
//既然他最終要展現一個web頁面,咱們就把整個運行文件拉到apache家目錄下,重命名爲myadm
cd /usr/local/httpd/htdocs/myadm
cp config.sample.inc.php config.inc.php
//把phpMyadmin模板配置文件重命名一下,好識別
vi config.inc.php
第31行
$cfg['Servers'][$i]['host'] = '127.0.0.1'; //把localhost 改爲IP ,不識別localhost,只能識別ip,這個ip是mysql數據庫服務器的ip,也能夠是mysql所在服務器的主機名,其實這個配置文件裏面應該都是和mysql相關的配置,畢竟他是管理mysql的嗎
http://192.168.80.182/myadm
//這裏的訪問涉及到一個虛擬目錄的概念,載網站根目錄下
咱們訪問192.168.80.182的index.php文件的時候,並無在後面加個後綴跟文件名,由於在apache配置文件裏面這條語句DirectoryIndex index.php index.html說明了apache默認識別的文件類型是php和html,沒有myadm,因此myadm並不能識別,因此須要在ip後面指定路徑,myadm裏面必定是有php後綴的網頁文件,否則怎麼這個工具以網頁文件顯示在web服務器上