lamp

Lamp

1.lamp簡介

所謂lamp,其實就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一組動態網站或者服務器的開源軟件,除Linux外其它各部件本身都是各自獨立的程序,但是因爲經常被放在一起使用,擁有了越來越高的兼容度,共同組成了一個強大的Web應用程序平臺。

知名網站架構

System Server Storage Script
Yahoo FreeBSD + Linux Apache MySQL PHP
Facebook FreeBSD Apache MySQL + Memcached PHP
Wikimedia Linux Apache + Lighttpd MySQL + Memcached PHP

2. web服務器工作流程

建立連接——接受一個客戶端連接,或者如果不希望與這個客戶端建立連接,就將其關閉。
接收請求——從網絡中讀取一條 HTTP 請求報文。
處理請求——對請求報文進行解釋,並採取行動。
訪問資源——訪問報文中指定的資源。
構建響應——創建帶有正確首部的 HTTP 響應報文。
發送響應——將響應回送給客戶端。
記錄事務處理過程——將與已完成事務有關的內容記錄在一個日誌文件中。

web服務器的資源分爲兩種,靜態資源和動態資源

靜態資源就是指靜態內容,客戶端從服務器獲得的資源的表現形式與原文件相同。可以簡單的理解爲就是直接存儲於文件系統中的資源
動態資源則通常是程序文件,需要在服務器執行之後,將執行的結果返回給客戶端
lamp

2.1 cgi與fastcgi

上圖階段①中提到了FastCGI,下面我們來了解下CGI與FastCGI。

CGI(Common Gateway Interface,通用網關接口),CGI是外部應用程序(CGI程序)與WEB服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的過程。CGI規範允許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。
FastCGI(Fast Common Gateway Interface)是CGI的改良版,CGI是通過啓用一個解釋器進程來處理每個請求,耗時且耗資源,而FastCGI則是通過master-worker形式來處理每個請求,即啓動一個master主進程,然後根據配置啓動幾個worker進程,當請求進來時,master會從worker進程中選擇一個去處理請求,這樣就避免了重複的生成和殺死進程帶來的頻繁cpu上下文切換而導致耗時

2.2 httpd與php結合的方式

httpd與php結合的方式有以下三種:

modules:php將以httpd的擴展模塊形式存在,需要加載動態資源時,httpd可以直接通過php模塊來加工資源並返回給客戶端
httpd prefork:libphp5.so(多進程模型的php)
httpd event or worker:libphp5-zts.so(線程模型的php)
CGI:httpd需要加載動態資源時,通過CGI與php解釋器聯繫,獲得php執行的結果,此時httpd負責與php連接的建立和斷開等
FastCGI:利用php-fpm機制,啓動爲服務進程,php自行運行爲一個服務,https通過socket與php通信
較於CGI方式,FastCGI更爲常用,很少有人使用CGI方式來加載動態資源

3. lamp平臺構建

適用環境
系統支持:CentOS-5 (32bit/64bit)、CentOS-6 (32bit/64bit)等linux系統
內存要求:≥256M
需要安裝有
1、Apache
2、MySQL
3、PHP
4、phpmyadmin 3.5.1
5、ZendOptimizer 3.3.9(可選,只適合PHP 5.2.17)
6、xcache 1.3.2(可選)
7、pure-ftpd-1.0.36(可選)

lamp平臺軟件安裝次序:httpd --> mysql --> php
注意:php要求httpd使用prefork MPM

3.1 安裝httpd

//安裝開發工具包
[root@system1 yum.repos.d]# yum groups mark install 'Development Tools'Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Marked install: Development Tools
//創建apache服務的用戶和組
[root@system1 yum.repos.d]# groupadd -r apache
[root@system1 yum.repos.d]# useradd -r -M -s /sbin/nologin -g apache apache
[root@system1 yum.repos.d]# yum -y install openssl-devel pcre-devel expat-devel libtool
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
//略

[root@system1 Desktop]# ls
apache apr-1.6.5.tar.bz2 apr-util-1.6.1.tar.bz2 copy httpd-2.4.37.tar.bz2
[root@system1 Desktop]# tar xf apr-1.6.5.tar.bz2
[root@system1 Desktop]# tar xf apr-util-1.6.1.tar.bz2
[root@system1 Desktop]# cd apr-1.6.5/
[root@system1 apr-1.6.5]# ls
apr-config.in build-outputs.mk helpers misc strings
apr.dep CHANGES include mmap support
apr.dsp CMakeLists.txt libapr.dep network_io tables
apr.dsw config.layout libapr.dsp NOTICE test
apr.mak configure libapr.mak NWGNUmakefile threadproc
apr.pc.in configure.in libapr.rc passwd time
apr.spec docs LICENSE poll tools
atomic dso locks random user
build emacs-mode Makefile.in README
buildconf encoding Makefile.win README.cmake
build.conf file_io memory shmem
[root@system1 apr-1.6.5]# vim configure

cfgfile=${ofile}T<br/>trap "$RM \"$cfgfile\"; exit 1" 1 2 15<br/>// $RM "$cfgfile" //將此句註釋或刪去

[root@system1 apr-1.6.5]# ./configure --prefix=/usr/local/apr //配置後略
[root@system1 apr-1.6.5]# make && make install //編譯後略

[root@system1 apr-1.6.5]# cd ..
[root@system1 Desktop]# cd apr-util-1.6.1/
[root@system1 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@system1 apr-util-1.6.1]# make && make install

3.2安裝Mysql

//安裝依賴包
[root@system1 Desktop]# yum -y install ncurses-devel openssl-devel openssl cmake mariadb-devel
Installing:
cmake x86_64 2.8.12.2-2.el7 myrepo 7.0 M
mariadb-devel x86_64 1:5.5.56-2.el7 myrepo 752 k
ncurses-devel x86_64 5.9-13.20130511.el7 myrepo 713 k
Installing for dependencies:
libarchive x86_64 3.1.2-10.el7_2 myrepo 319 k

Transaction Summary

Install 3 Packages (+1 Dependent package)

Total download size: 8.8 M
.....
Installed:
cmake.x86_64 0:2.8.12.2-2.el7 mariadb-devel.x86_64 1:5.5.56-2.el7
ncurses-devel.x86_64 0:5.9-13.20130511.el7

Dependency Installed:
libarchive.x86_64 0:3.1.2-10.el7_2

Complete!

//創建用戶和組
[root@system1 Desktop]# groupadd -r -g 306 mysql
[root@system1 Desktop]# useradd -M -s /sbin/nologin -g 306 -u 306 mysql

//下載二進制格式的mysql軟件包
[root@system1 ~]# cd /usr/src/
[root@system1 src]# wget https://downloads.mysql.com/archives/get/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
--2018-08-13 23:56:27-- https://downloads.mysql.com/archives/get/file/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
Resolving downloads.mysql.com (downloads.mysql.com)... 137.254.60.14
Connecting to downloads.mysql.com (downloads.mysql.com)|137.254.60.14|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz [following]
......
Saving to: ‘mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz’

100%[=====================================>] 643,790,848 2.46MB/s in 4m 20s

2018-08-14 00:00:50 (2.36 MB/s) - ‘mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz’saved [643790848/643790848]

//解壓軟件至/usr/local/
[root@system1 src]# ls
debug kernels mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
[root@system1 src]# tar xf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@system1 ~]# ls /usr/local/
bin games lib libexec sbin src
etc include lib64 mysql-5.7.22-linux-glibc2.12-x86_64 share
[root@system1 ~]# cd /usr/local/
[root@system1 local]# ln -sv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql
‘mysql’ -> ‘mysql-5.7.22-linux-glibc2.12-x86_64/’
[root@system1 local]# ll
total 0
drwxr-xr-x. 2 root root 6 Mar 10 2016 bin
drwxr-xr-x. 2 root root 6 Mar 10 2016 etc
drwxr-xr-x. 2 root root 6 Mar 10 2016 games
drwxr-xr-x. 2 root root 6 Mar 10 2016 include
drwxr-xr-x. 2 root root 6 Mar 10 2016 lib
drwxr-xr-x. 2 root root 6 Mar 10 2016 lib64
drwxr-xr-x. 2 root root 6 Mar 10 2016 libexec
lrwxrwxrwx 1 root root 36 Aug 14 16:00 mysql -> mysql-5.7.22-linux-glibc2.12-x86_64/
drwxr-xr-x 9 root root 129 Aug 14 00:16 mysql-5.7.22-linux-glibc2.12-x86_64
drwxr-xr-x. 2 root root 6 Mar 10 2016 sbin
drwxr-xr-x. 5 root root 49 Jun 13 19:03 share
drwxr-xr-x. 2 root root 6 Mar 10 2016 src

//修改目錄/usr/local/mysql的屬主屬組
[root@system1 ~]# chown -R mysql.mysql /usr/local/mysql
[root@system1 ~]# ll /usr/local/mysql -d
lrwxrwxrwx 1 mysql mysql 36 Aug 14 16:00 /usr/local/mysql -> mysql-5.7.22-linux-glibc2.12-x86_64/

//添加環境變量
[root@system1 ~]# ls /usr/local/mysql
bin COPYING docs include lib man README share support-files
[root@system1 ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@system1 ~]# . /etc/profile.d/mysql.sh
[root@system1 ~]# echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

//建立數據存放目錄
[root@system1 mysql]# mkdir /opt/data
[root@system1 mysql]# chown -R mysql.mysql /opt/data/
[root@system1 mysql]# ll /opt/
total 0
drwxr-xr-x 2 mysql mysql 6 Aug 14 16:54 data

//初始化數據庫
[root@system1 ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data/
2018-08-15T07:57:46.168380Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-08-15T07:57:50.542516Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-08-15T07:57:50.927286Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-08-15T07:57:51.071260Z 0 [Warning] No existing UUID has been found, so we assume that this is the first
//這個命令的最後會生成一個臨時密碼

//配置mysql
[root@system1 ~]# ln -sv /usr/local/mysql/include/ /usr/local/include/mysql
‘/usr/local/include/mysql’ -> ‘/usr/local/mysql/include/’
[root@system1 ~]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
[root@system1 ~]# ldconfig -v
ldconfig: Can't stat /libx32: No such file or directory
ldconfig: Path /usr/lib' given more than once<br/>ldconfig: Path/usr/lib64' given more than once
ldconfig: Can't stat /usr/libx32: No such file or directory
/usr/lib64/mysql:
libmysqlclient.so.18 -> libmysqlclient_r.so
/usr/local/mysql/lib:
libmysqlclient.so.20 -> libmysqlclient.so.20.3.9
......
/lib/sse2: (hwcap: 0x0000000004000000)
/lib64/sse2: (hwcap: 0x0000000004000000)
/lib64/tls: (hwcap: 0x8000000000000000)
[root@system1 ~]# ldconfig -p |grep mysql
libmysqlclient.so.20 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.20
libmysqlclient.so.18 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.18
libmysqlclient.so (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so
libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so

//生成配置文件
[root@system1 ~]# cat > /etc/my.cnf <<EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
EOF

//配置服務啓動腳本
[root@system1 ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@system1 ~]# sed -ri 's#^(basedir=).#\1/usr/local/mysql#g' /etc/init.d/mysqld
[root@system1 ~]# sed -ri 's#^(datadir=).
#\1/opt/data#g' /etc/init.d/mysqld

//啓動mysql
[root@system1 ~]# service mysqld start
Starting MySQL.. SUCCESS!
[root@system1 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :22 :
LISTEN 0 100 127.0.0.1:25
:
LISTEN 0 128 :::22 :::

LISTEN 0 100 ::1:25 :::
LISTEN 0 80 :::3306 :::

//修改密碼

3.3安裝php

3.4配置Apache

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章