1. 程式人生 > >筆記10 LAMP架構(MySQL、mariadb、Apache、PHP5、PHP7、)

筆記10 LAMP架構(MySQL、mariadb、Apache、PHP5、PHP7、)

架構 lamp


MySQL安裝


MySQL的幾個常用安裝包:rpm、源碼、二進制免編譯

把下載的包保存在這個目錄裏:cd /usr/local/src 所以要先進入這個目錄下

第一步,下載源碼包:

wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

第二步,解壓:

tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

第三步,把解壓的這個目錄移動到usr、local下並改名為mysql:

mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql

第四步,進入到這個目錄下:

cd /usr/local/mysql

第五步,創建一個mysql用戶:

useradd mysql

第六步,創建一個目錄:這個目錄是為了存放mysql的數據

mkdir /data/

第七步,初始化一下讓它生成/data/mysql這個目錄:

./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

第七步,拷貝配置文件,配置文件在ls /support-files/my-default.cnf裏邊(模板配置文件)

把它拷貝到/etc/下,改名叫my.cnf(mysqld的配置文件就叫my.cnf固定放在etc下)

cp support-files/my-default.cnf /etc/my.cnf

第八步,拷貝啟動腳本

cp support-files/mysql.server /etc/init.d/mysqld

第九步,編輯配置文件

vi /etc/init.d/mysqld

定義basedir和datadir

技術分享

第十步,添加到系統服務中去:

chkconfig --add mysqld 查看一下:chkconfig --list

第十一步,啟動服務:service mysqld start 或者用:/etc/init.d/mysqld start

查看進程:ps aux |grep mysql

查看監聽端口:netstat -lntp

停掉服務命令:service mysqld stop

也可以用命令行的方法啟動:

技術分享

停掉服務命令:killall mysqld

如果碰到mysqld的進程殺不死你等了一分鐘還沒有殺死ps還會有進程那證明他數據量很大正在慢慢寫入到磁盤裏去這事你不能用kill -9殺死這個進程這樣可能會導致你丟失數據或者損壞你的表


mariadb安裝


cd /usr/local/src

下載二進制源碼包:wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz

解壓安裝包:tar zxvf mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz

把安裝包拷貝到usr/local目錄下來:mv mariadb-10.2.6-linux-glibc_214-x86_64 /usr/local/mariadb

cd /usr/local/mariadb

./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb/ --datadir=/data/mariadb

cp support-files/my-small.cnf /usr/local/mariadb/my.cnf

vi /usr/local/mariadb/my.cnf //定義basedir和datadir 基本不用改

cp support-files/mysql.server /etc/init.d/mariadb

vim /etc/init.d/mariadb //

定義basedir=/usr/local/mariadb

datadir=/data/mariadb

conf=$basedir/my.cnf 以及啟動參數

技術分享

最後在啟動腳本定義:搜 /start 大概在300行,定義一下,加上下邊的的內容:

技術分享

啟動它:/etc/init.d/mariadb start

啟動它之前先看看有沒有mysqld服務在運行,先把它關掉。

查看是否啟動成功:ps aux |grep mariadb

查看監聽端口:netstat -lntp 是不是3306


Apache安裝


Apache是一個基金會的名字,httpd才是我們要安裝的軟件包,早期它的名字就叫apache

Apache官網www.apache.org

第一步,下載這三個包:

wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.27.tar.gz

wget http://mirrors.hust.edu.cn/apache/apr/apr-1.5.2.tar.gz

wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.5.4.tar.gz

apr和apr-util是一個通用的函數庫,它讓httpd可以不關心底層的操作系統平臺,可以很方便地移植(從linux移植到windows)

第二步,解壓這三個包:

tar zxvf httpd-2.4.27.tar.gz

tar zxvf apr-util-1.5.4.tar.gz

tar zxvf apr-1.5.2.tar.gz

第三步,安裝apr:

1.先進到apr-1.5.2目錄下:cd /usr/local/src/apr-1.5.2

2.安裝apr:./configure --prefix=/usr/local/apr

3.make && make install

他下邊會有四個目錄:ls /usr/local/apr

安裝apr-util:

1.進到目錄下:cd /usr/local/src/apr-util-1.5.4

2.安裝:./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

3.make && make install

編譯httpd:

1.進到目錄下:cd /usr/local/src/httpd-2.4.27

2.安裝:./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most

3.make && make install

ls /usr/local/apache2.4/modules

/usr/local/apache2.4/bin/httpd -M //查看加載的模塊


啟動apache:/usr/local/apache2.4/bin/apachectl start


安裝PHP5


PHP官網www.php.net

當前主流版本為5.6/7.1

第一步,進到src目錄下:cd /usr/local/src/

第二步,下載安裝包:wget http://cn2.php.net/distributions/php-5.6.30.tar.gz

第三步,解壓:tar zxf php-5.6.30.tar.gz

第四步,進到目錄下:cd php-5.6.30

第五步,安裝編譯:./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif

make && make install

第六步,拷貝:cp php.ini-production /usr/local/php/etc/php.ini


安裝PHP7

安裝方法跟PHP5一樣!!!

cd /usr/local/src/

wget http://cn2.php.net/distributions/php-7.1.6.tar.bz2

tar jvxf php-7.1.6.tar.bz2

cd php-7.1.6

./configure --prefix=/usr/local/php7 --with-apxs2=/usr/local/apache2.4/bin/apxs --with-config-file-path=/usr/local/php7/etc --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif

make && make install

ls /usr/local/apache2.4/modules/libphp7.so

cp php.ini-production /usr/local/php7/etc/php.ini

PHP5跟PHP7不想用哪個就把它註釋掉,編輯配置文件:

vim /usr/local/apache2.4/conf/httpd.conf

技術分享


配置http支持PHP


httpd主配置文件/usr/local/apache2.4/conf/httpd.conf

vim /usr/local/apache2.4/conf/httpd.conf //修改以下4個地方

第一步,搜索ServerName 把這個服務打開

技術分享

第二步,搜索:Require all denied 改成:Require all granted


每次寫完配置文件都要執行一下這兩步!!

檢查配置文件語法是否正確,加上-t選項:

/usr/local/apache2.4/bin/apachectl -t

重新加載配置文件,加上graceful:

/usr/local/apache2.4/bin/apachectl graceful

第三步,搜AddType加上下邊這條命令:

AddType application/x-httpd-php .php 加他的目的是為了能讓php能解析

技術分享

第四步,搜索Index,加上下邊語句:

DirectoryIndex index.html index.php

第五步,寫一個腳本看看php能不能解析:

vi /usr/local/apache2.4/htdocs/1.php

<?php

phpinfo();

?>

寫完訪問一下192.168.65.135/1.php

如果不能解析那麽你就檢查一下Apache配置文件:

第一項,看看php5有沒有加載:

/usr/local/apache2.4/bin/apachectl -M

如果沒有加載php5,你就要看看他有沒有這個模塊:

ls /usr/local/apache2.4/modules/libphp5.so

查看配置文件裏邊有沒有加載php5:

vim /usr/local/apache2.4/conf/httpd.conf

在查看配置文件裏有沒有加載AddType這一行:

AddType application/x-httpd-php .php

/usr/local/apache2.4/bin/apachectl -t //測試語法

/usr/local/apache2.4/bin/apachectl start //啟動服務

netstat -lntp

curl localhost

vim /usr/local/apache2.4/htodcs/test.php //增加如下內容

<?php

echo 123;

?>

curl localhost/test.php


http的默認虛擬主機


一臺服務器可以訪問多個網站,每個網站都是一個虛擬主機

概念:域名(主機名)、DNS、解析域名、hosts

任何一個域名解析到這臺機器,都可以訪問的虛擬主機就是默認虛擬主機

編輯配置文件:vim /usr/local/apache2.4/conf/httpd.conf 搜索httpd-vhost,去掉#

配置虛擬主機:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf//改為如下

<VirtualHost *:80>

ServerAdmin [email protected] 這個是要定義郵箱,要不要無所謂

DocumentRoot "/data/wwwroot/abc.com" 這個定義網站的根目錄在哪裏

ServerName abc.com 網站域名

ServerAlias www.abc.com www.123.com 網站別名,可以寫多個域名

ErrorLog "logs/abc.com-error_log" 錯誤日誌

CustomLog "logs/abc.com-access_log" common 訪問日誌

</VirtualHost>


<VirtualHost *:80>

DocumentRoot "/data/wwwroot/111.com"

ServerName www.111.com

ServerAlias www.exaple.com

ErrorLog "logs/111.com-error_log"

CustomLog "logs/111.com-access_log" common

更改完創建對應的目錄:

mkdir /data/wwwroot/ mkdir /data/wwwroot/abc.com mkdir /data/wwwroot/111.com

然後在對應的站點根目錄下創建一個index.php

vim /data/wwwroot/abc.com/index.php

<?php

echo "abc.com";

vim /data/wwwroot/111.com/index.php

<?php

echo "111.com"

</VirtualHost>

最後檢查、重啟

/usr/local/apache2.4/bin/apachectl –t

/usr/local/apache2.4/bin/apachectl graceful

測試

mkdir -p /data/wwwroot/aming.com /data/wwwroot/www.123.com

echo "aming.com" > /data/wwwroot/aming.com/index.html //網站默認的主頁就是index.html

echo "123.com" > /data/wwwroot/123.com/index.html

curl -x127.0.0.1:80 aming.com //這樣會去訪問aming.com/index.html

curl -x127.0.0.1:80 www.123.com //訪問www.123.com

curl -x127.0.0.1:80 www.abc.com


httpd的用戶認證



vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把123.com那個虛擬主機編輯成如下內容

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/www.123.com"

ServerName www.123.com

<Directory /data/wwwroot/www.123.com> //指定認證的目錄

AllowOverride AuthConfig //這個相當於打開認證的開關

AuthName "123.com user auth" //自定義認證的名字,作用不大

AuthType Basic //認證的類型,一般為Basic,其他類型阿銘沒用過

AuthUserFile /data/.htpasswd //指定密碼文件所在位置

require valid-user //指定需要認證的用戶為全部可用用戶

</Directory>

</VirtualHost>

/usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd aming

重新加載配置-t , graceful

綁定hosts,瀏覽器測試

curl -x127.0.0.1:80 www.123.com //狀態碼為401

curl -x127.0.0.1:80 -uaming:passwd www.123.com //狀態碼為200


還可以針對單個文件進行認證

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/www.123.com"

ServerName www.123.com

<FilesMatch admin.php>

AllowOverride AuthConfig

AuthName "123.com user auth"

AuthType Basic

AuthUserFile /data/.htpasswd

require valid-user

</FilesMatch>

</VirtualHost>



域名跳轉


需求,把123.com域名跳轉到www.123.com,配置如下:

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/www.123.com"

ServerName www.123.com

ServerAlias 123.com

<IfModule mod_rewrite.c> //需要mod_rewrite模塊支持

RewriteEngine on //打開rewrite功能

RewriteCond %{HTTP_HOST} !^www.123.com$ //定義rewrite的條件,主機名(域名)不是www.123.com滿足條件

RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L] //定義rewrite規則,當滿足上面的條件時,這條規則才會執行

</IfModule>

</VirtualHost>

/usr/local/apache2/bin/apachectl -M|grep -i rewrite //若無該模塊,需要編輯配置文件

vi /usr/local/apache2.4/conf/httpd.conf

刪除rewrite_module (shared) 前面的#

curl -x127.0.0.1:80 -I 123.com //狀態碼為301


httpd訪問日誌


訪問日誌記錄用戶的每一個請求

vim /usr/local/apache2.4/conf/httpd.conf //搜索LogFormat

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common

把虛擬主機配置文件改成如下:

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/www.123.com"

ServerName www.123.com

ServerAlias 123.com

CustomLog "logs/123.com-access_log" combined

</VirtualHost>

重新加載配置文件 -t,graceful

curl -x127.0.0.1:80 -I 123.com

tail /usr/local/apache2.4/logs/123.com-access_log



訪問日誌不記錄靜態文件


網站大多元素為靜態文件,如圖片、css、js等,這些元素可以不用記錄

把虛擬主機配置文件改成如下:

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/www.123.com"

ServerName www.123.com

ServerAlias 123.com

SetEnvIf Request_URI ".*\.gif$" img

SetEnvIf Request_URI ".*\.jpg$" img

SetEnvIf Request_URI ".*\.png$" img

SetEnvIf Request_URI ".*\.bmp$" img

SetEnvIf Request_URI ".*\.swf$" img

SetEnvIf Request_URI ".*\.js$" img

SetEnvIf Request_URI ".*\.css$" img

CustomLog "logs/123.com-access_log" combined env=!img

</VirtualHost>

重新加載配置文件 -t, graceful

mkdir /data/wwwroot/www.123.com/images //創建目錄,並在這目錄下上傳一個圖片

curl -x127.0.0.1:80 -I 123.com/images/123.jpg

tail /usr/local/apache2.4/logs/123.com-access_log


訪問日誌切割


日誌一直記錄總有一天會把整個磁盤占滿,所以有必要讓它自動切割,並刪除老的日誌文件

把虛擬主機配置文件改成如下:

<VirtualHost *:80>

DocumentRoot "/data/wwwroot/www.123.com"

ServerName www.123.com

ServerAlias 123.com

SetEnvIf Request_URI ".*\.gif$" img

SetEnvIf Request_URI ".*\.jpg$" img

SetEnvIf Request_URI ".*\.png$" img

SetEnvIf Request_URI ".*\.bmp$" img

SetEnvIf Request_URI ".*\.swf$" img

SetEnvIf Request_URI ".*\.js$" img

SetEnvIf Request_URI ".*\.css$" img

CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img

</VirtualHost>

重新加載配置文件 -t, graceful

ls /usr/local/apache2.4/logs


靜態元素過期時間


瀏覽器訪問網站的圖片時會把靜態的文件緩存在本地電腦裏,這樣下次再訪問時就不用去遠程下載了

增加配置

<IfModule mod_expires.c>

ExpiresActive on //打開該功能的開關

ExpiresByType image/gif "access plus 1 days"

ExpiresByType image/jpeg "access plus 24 hours"

ExpiresByType image/png "access plus 24 hours"

ExpiresByType text/css "now plus 2 hour"

ExpiresByType application/x-javascript "now plus 2 hours"

ExpiresByType application/javascript "now plus 2 hours"

ExpiresByType application/x-shockwave-flash "now plus 2 hours"

ExpiresDefault "now plus 0 min"

</IfModule>

查看一下服務是否開啟:

/usr/local/apache2.4/bin/apachectl -M |grep expaire

沒開啟需要編輯配置文件搜索:expires_module 把前邊的#去掉

vim /usr/local/apache2.4/conf/httpd.conf

重新加載一下,在查看一下服務:

/usr/local/apache2.4/bin/apachectl graceful

curl測試,看cache-control: max-age


配置防盜鏈


通過限制referer來實現防盜鏈的功能

配置文件增加如下內容

<Directory /data/wwwroot/www.111.com>

SetEnvIfNoCase Referer "http://www.111.com" local_ref

SetEnvIfNoCase Referer "http://askapelearn.com" local_ref

SetEnvIfNoCase Referer "^$" local_ref

<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">

Order Allow,Deny

Allow from env=local_ref

</filesmatch>

</Directory>

curl -e "http://www.aminglinux.com/123.html" 自定義referer


訪問控制-Directory


核心配置文件內容

<Directory /data/wwwroot/www.111.com/admin/>

Order deny,allow 以這順序為主

Deny from all 先拒絕

Allow from 127.0.0.1 在允許

</Directory>

curl測試狀態碼為403則被限制訪問了


訪問控制-FilesMatch


核心配置文件內容

<Directory /data/wwwroot/www.123.com>

<FilesMatch "admin.php(.*)">

Order deny,allow

Deny from all

Allow from 127.0.0.1

</FilesMatch>

</Directory>


訪問控制-禁止php解析


核心配置文件內容

<Directory /data/wwwroot/www.123.com/upload>

php_admin_flag engine off

<FilesMatch (.*)\.php(.*)>

Order allow,deny

Deny from all

</Directory>

curl測試時直接返回了php源代碼,並未解析


訪問控制-user_agent


user_agent可以理解為瀏覽器標識

CC是一種訪問攻擊,它利用很多個肉雞訪問,是很有規律的訪問,這時我們需要用user_agent來控制。

核心配置文件內容

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //NC:表示忽略大小寫 OR:或者

RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]

RewriteRule .* - [F]

</IfModule>

curl -A "123123" 指定user_agent,模擬user_agent


php相關配置


查看php配置文件位置

/usr/local/php/bin/php -i|grep -i "loaded configuration file"但是這個不準

模擬一下,在111目錄下創建一個phpinfo

編輯:vi index.php

把這個寫進去:

<?php

phpinfo();

登錄網站:111.com/index.php查看它的配置文件,但是他並沒有加載,我們需要復制一份:

先進入到他的源碼包:cd /usr/local/src/php-7.1.6/

拷貝:cp php.init-development /usr/local/php7/etc/php.ini

刷新配置:/usr/local/apache2.4/bin/apachectl graceful

找到phpinfo所在的路徑打開它進行配置

技術分享

vim /usr/local/php7/etc/php.ini

搜索date.timezone定義時區

Asia/Shanghai 上海

禁掉一些安全相關的函數

搜索下邊這個:默認他是空的,把下邊這些安全安全函數粘貼進去

disable_functions 安全函數

eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo

打開調試錯誤日誌

搜索:display_errors

把On改成Off 這樣他就不會把錯誤信息輸出到瀏覽器中

配置一個錯誤日誌搜索:log_errors On表示開啟,

把日誌定義到一個地方,搜索error_log,比如我們放到/tmp/php_errors.log下去,還要定義errors.log的級別,搜索:error_reporting

open_basedir安全選項

你一臺服務器上跑了很多個站點,可能會有一個站點上代碼有問題,結果站點被黑了,被人拿到了權 限,然後他會往裏滲透,又跑到另一個站點,但是這時我要加一個open_basedir,他就有可能黑不了,我們可以給它做一個隔離,A網站目錄在A目錄下B網站在B目錄下,這樣即使A網站被黑了他也看不到B網站的目錄,也不會被牽連進來,

搜索open_basedir

定義格式:/data/wwwroot/111.com:/

如果你這個網站上跑了N多個站點,可以再aoach的虛擬主機裏邊編輯:

打開:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

加上這個php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"


php動態擴展模塊


/usr/local/php/bin/php -m //查看模塊

下面安裝一個redis的模塊

cd /usr/local/src/

wget https://codeload.github.com/phpredis/phpredis/zip/develop

mv develop phpredis-develop.zip

unzip phpredis-develop.zip

cd phpredis-develop

/usr/local/php7/bin/phpize //生成configure文件

./configure --with-php-config=/usr/local/php7/bin/php-config

make && make install

/usr/local/php/bin/php -i |grep extension_dir //查看擴展模塊存放目錄,我們可以在php.ini中去自定義該路徑

vim /usr/local/php/etc/php.ini //增加一行配置(可以放到文件最後一行)

extension = redis.so


本文出自 “12912638” 博客,請務必保留此出處http://12922638.blog.51cto.com/12912638/1954272

筆記10 LAMP架構(MySQL、mariadb、Apache、PHP5、PHP7、)