1. 程式人生 > 實用技巧 >LAMP環境搭建

LAMP環境搭建

LAMP 是Linux Apache MySQL PHP的簡寫,其實就是把Apache, MySQL以及PHP安裝在Linux系統上,組成一個環境來執行php的指令碼語言。

Apache是最常用的WEB服務軟體,而MySQL是比較小型的資料庫軟體,這兩個軟體以及PHP都可以安裝到windows的機器上。下面開始如何構建這個LAMP環境。


一.安裝mysql

我們平時安裝MySQL都是原始碼包安裝的,但是由於它的編譯需要很長的時間。所以,建議您安裝二進位制免編譯包。

可以到MySQL官方網站去下載 http://dev.mysql.com/downloads/

具體版本根據您的平臺和需求而定,目前比較常用的為mysql-5.0/mysql-5.1, 5.5版本雖然已經發布有段日子了,但是貌似用在線上跑服務的還是少數。

所以,可以使用下面地址下載:

mirrors.sohu.com/mysql/

注意,什麼樣的機型就要下對應的版本,64位的要下64位的,32位的就要下32位的!


1.下載mysql到/usr/local/src/

命令1:wget http://www.lishiming.net/data/p_w_upload/forum/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz(32位)

命令2:wget http://syslab.comsenz.com/downloads/linux/mysql-5.1.40-linux-x86_64-icc-glibc23.tar.gz(64位)

2.解壓

命令:tar zxvf /usr/local/src/mysql-5.1.40-linux-i686-icc-glibc23.tar.gz

3.把解壓完的資料移動到/usr/local/mysql

命令:mvmysql-5.1.40-linux-i686-icc-glibc23 /uer/local/mysql

4.建立mysql使用者

命令:useradd -s /sbin/nologin mysql

5.初始化資料庫

命令1:cd /usr/local/mysql

命令2:mkdir -p /data/mysql ; chown -R mysql:mysql /data/mysql

命令3:./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

--user 定義資料庫的所屬主, --datadir 定義資料庫安裝到哪裡,建議放到大空間的分割槽上,這個目錄需要自行建立。這一步驟很關鍵,我在mysql初始化資料上掙扎了好久,出現好幾個問題。


第一個問題,我的系統是64位的系統,卻安裝了32位的mysql軟體,出現了下面這種情況:

wKioL1XlV76BdlQEAAHQzb5KPYE566.jpg

然後我重新安裝了64位的mysql,出現了第二個問題:

wKiom1XlVduyoDLTAAO7pWcV2dM482.jpg

這種情況是因為缺少lib庫檔案,只要安裝一下即可:

命令:yum install -ycompat-libstdc++-33

還有一種情況:

wKiom1aYaXaRjuRqAABh61MmQms425.png命令:yum install -y libaio

mysql初始化成功後會出現下面的情況:

wKiom1XlVsjBlZ88AAYi-F4mnCU608.jpg

6.拷貝配置檔案

命令:cp support-files/my-large.cnf /etc/my.cnf

7.拷貝啟動指令碼檔案修改其屬性

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

命令:chmod 755 /etc/init.d/mysqld

8.修改啟動指令碼

命令:vim /etc/init.d/mysqld

需要修改的地方有 “datadir=/data/mysql” (前面初始化資料庫時定義的目錄)

9.把啟動指令碼加入系統服務項,並設定開機啟動,啟動mysql

命令:chkconfig --add mysqld

命令:chkconfig mysqld on

命令:service mysqld start

如果啟動不了,請到 /data/mysql/ 下檢視錯誤日誌,這個日誌通常是主機名.err.

檢查mysql是否啟動的命令為:

命令:ps aux |grep mysqld


二.安裝Apache

apache也需要到官網下載合適的版本,目前使用較多的版本為2.0或者2.2,建議下載2.2版本。

apache官網下載地址: http://www.apache.org/dyn/closer.cgi

您也可以使用阿銘提供的地址下載。

1.切換到/usr/local/src/,下載。

命令1:cd /usr/local/src/

命令2:wget http://www.lishiming.net/data/p_w_upload/forum/httpd-2.2.24.tar.bz2


2.解壓:

命令:tar jvxf httpd-2.2.24.tar.bz2


3.配置編譯引數:

命令1:cd httpd-2.2.24

命令2:./configure \

--prefix=/usr/local/apache2 \

--with-included-apr \

--enable-so \

--enable-deflate=shared \

--enable-expires=shared \

--enable-rewrite=shared \

--with-pcre

--prefix 指定安裝到哪裡;

--enable-so 表示啟用DSO;

--enable-deflate=shared 表示共享的方式編譯deflate;

後面的引數同理。


如果這一步您出現了這樣的錯誤:

error: mod_deflate has been requested but can not be built due to prerequisite failures


解決辦法是:

命令:yum install -y zlib-devel


為了避免在make的時候出現錯誤,所以最好是提前先安裝好一些庫檔案:

命令:yum install -y pcre pcre-devel apr apr-devel


4.編譯:

命令:make


5.安裝:

命令:make install


以上兩個步驟都可以使用 echo $? 來檢查是否正確執行,否則需要根據錯誤提示去解決問題。


6.啟動服務:

命令:/usr/local/apache2/bin/apachectl start


7.檢視監聽埠:

命令:netstat -lnp

檢視一下監聽埠是否為80

但是,我卻出現了這樣的狀況!!

wKioL1XmjtOAiKqPAADa0qcwaJk582.jpg


雖然不妨礙使用,可是看著錯誤總覺得彆扭。

經過查詢發現,這個問題應該是沒有在/etc/httpd/conf/httpd.conf中設定ServerName。

所以apache會用主機上的名稱來取代,首先會去找/etc/hosts中有沒有主機的定義。

所以要解決這個問題可以設定httpd.conf檔案中的ServerName,如下:

(1)命令:vim /usr/local/apache2/conf/httpd.conf

修改httpd.conf檔案,增加:ServerNamewww.example.com:80
或者在/etc/hosts中填入自己的主機名稱bogon,如下:

(2)127.0.0.1 bogon


介紹下下面幾條命令:

命令:/uer/local/apache2/bin/apachectl -M

作用:將一些靜態的模組還有一些動態的模組列出來

wKioL1XmnyDTpKKgAANpLvqeJak540.jpg

命令:/uer/local/apache2/bin/apachectl -l

作用:把靜態的模組列出來

wKiom1XmnfvRo25zAAFdrVmfFeU686.jpg

命令:/uer/local/apache2/bin/apachectl -t

作用:檢視配置檔案有沒有語法錯誤。

那麼配置檔案在哪裡呢?

在這裡:ls /usr/local/apache2/conf/heepd.conf

wKiom1XmnhCzUs86AAC8Sw_MMII566.jpg

重啟apache

命令1:/usr/local/apache2/bin/apachectl restart

命令2:/usr/local/apache2/bin/apachectl graceful

那麼這兩個命令有什麼區別嗎?

命令1是把程序殺死在重新開啟

命令2是原來的程序還存在,只是重新載入一下

但兩者就結果而言是一樣的


三.安裝PHP

因為公司一直在使用5.2版本,但是考慮到版本太老,難免會有些漏洞。

所以建議您使用5.3或者5.4版本。

php官方下載地址: http://www.php.net/downloads.php

給個懶人通道:http://php.net/get/php-5.4.36.tar.bz2/from/a/mirror


1.下載php:

命令:cd /usr/local/src

命令:wgethttp://cn2.php.net/distributions/php-5.4.36.tar.bz2


2.解壓:

命令:tar zxf php-5.4.36.tar.bz2


3.配置編譯引數:

命令:cd php-5.4.36

命令:./configure \

--prefix=/usr/local/php \

--with-apxs2=/usr/local/apache2/bin/apxs \

--with-config-file-path=/usr/local/php/etc \

--with-mysql=/usr/local/mysql \

--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 \

--disable-ipv6


在這一步,遇到如下錯誤:

configure: error: xml2-config not found. Please check your libxml2 installation.

解決辦法是:

命令:yum install -y libxml2-devel

然而,我們會發現,並沒有這些庫檔案,那麼我就要來下載這些庫檔案的下載包

32位下載地址: www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_32.noarch.rpm

64位下載地址: www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_64.noarch.rpm

命令1:rpm -ivh 'http://www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_32.noarch.rpm'

命令2:rpm -ivh 'http://www.lishiming.net/data/p_w_upload/forum/epel-release-6-8_64.noarch.rpm'

還有錯誤:

configure: error: Cannot find OpenSSL's <evp.h>

解決辦法是:

命令:yum install -y openssl openssl-devel


錯誤:

error: jpeglib.h not found

解決方案:

命令:yum install libjpeg-devel

錯誤:

checking for BZip2 in default path... not found

configure: error: Please reinstall the BZip2 distribution

解決辦法:

命令:yum install -y bzip2 bzip2-devel


錯誤:

configure: error: png.h not found.

解決辦法:

命令:yum install -y libpng libpng-devel

錯誤:

configure: error: freetype.h not found.

解決辦法:

命令:yum install -y freetype freetype-devel


錯誤:

configure: error: mcrypt.h not found. Please reinstall libmcrypt.

解決辦法:

命令:rpm -ivh "http://www.lishiming.net/data/p_w_upload/forum/month_1211/epel-release-6-7.noarch.rpm"

命令:yum install -y libmcrypt-devel


因為centos6.x 預設的yum源沒有libmcrypt-devel 這個包,只能藉助第三方yum源。


4.編譯:

命令:make

在這一步,您也許還會遇到諸多錯誤,沒有關係,請仔細檢視報錯資訊,解決辦法很簡單,就是裝缺少的庫。您可以把錯誤資訊複製到google上搜一下。

這個過程可能等待時間會很長,請耐心等候!


5.安裝:

命令:make install


6.拷貝配置檔案:

命令:cp php.ini-production /usr/local/php/etc/php.ini

下面說下PHP一些小技巧:

命令1:/usr/local/php/bin/php -m

作用:檢視有哪些模組(靜態載入的)


命令2:/usr/local/php/bin/php -i

作用:檢視一下相關的配置


四.測試PHP解析

目的是能夠實現怎麼去跑一個php網站。

Apache主配置檔案為:/usr/local/apache2/confspacer.giftpd.conf

命令:vim/usr/local/apache2/confspacer.giftpd.conf

找到:

AddTypeapplication/x-gzip.gz.tgz

在該行下面新增:
AddTypeapplication/x-httpd-php.php


找到:
<IfModuledir_module>
DirectoryIndexindex.html
</IfModule>

將該行改為:
<IfModuledir_module>
DirectoryIndexindex.htmlindex.htmindex.php
</IfModule>

找到:
ServerNamewww.example.com:80
修改為:
ServerNamelocalhost:80


五.測試LAMP是否成功

啟動apache之前先檢驗配置檔案是否正確:
命令:/usr/local/apache2/bin/apachectl-t

如果有錯誤,請繼續修改httpd.conf。

我在安裝過程中有一個錯誤

wKioL1XuVRixptopAACfNz2CY1s429.jpg

這是因為我在配置/usr/local/apache2/conf/httpd.conf的時候

AddType application/x-httpd-php .php加一個空格


如果是正確的則顯示為“SyntaxOK”。


啟動apache的命令為:
命令:/usr/local/apache2/bin/apachectlstart


檢視是否啟動:
命令:netstat-lnp|grephttpd

wKioL1XuUdKSBlHRAAD-SeeqdEA065.jpg

如果有顯示這行,則啟動了。


也可以使用curl命令簡單測試:
命令:curllocalhost

wKiom1XuT_WRnOmQAAE-Fma5oUs893.jpg

只有顯示這樣才正確。

測試是否正確解析php:
命令:
vim/usr/local/apache2/htdocs/1.php


寫入:
<?php
echo"php解析正常";
?>

儲存後,繼續測試:
命令:curllocalhost/1.php

看是否能看到如下資訊:

wKiom1XuduWBHGKNAADAomKtwRw915.jpg

只有顯示這樣才正確。


六.搭建Discuz論壇

1.首先要去下載一個Discuz

官網:http://download.comsenz.com/DiscuzX/3.2/

wKioL1Xue0zDJrIMAAHTMz4YxME219.jpg

2.建立一個目錄用來作為Discuz程式的根目錄

命令:mkdir /data/www

命令:cd /data/www

命令:wgethttp://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip

wKioL1XufNOzccgtAAPREd8uY1U743.jpg

3.解壓一下壓縮包

命令:unzip Discuz_X3.2_SC_GBK.zip


4.將程式目錄下的檔案挪出來,並刪除程式目錄以外的所以程式

wKioL1Xuf3KDsSX9AAMmjJdnJHc251.jpg

5.配置apache的配置檔案

命令:vim /usr/local/apache2/conf/httpd.conf

然後將虛擬主機開啟

wKiom1Xufs7xiQ1zAAHAemC146E159.jpg

然後編輯這個虛擬主機的配置檔案

命令:vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

wKioL1XugfuSWrBEAALYZd8pNoY933.jpg

將下面這個<VirtualHost *:80>刪除,再編輯上面的:

1.去掉第一行的管理員郵箱;

2.將第二行的DocumentRoot的絕對路徑改成/data/www;

3.ServerName改為:www.wyl.com(這個隨意,改成什麼都行)

4.ServerAlias改為:www.cyy.com(這個也隨意)

5.後面的錯誤的日誌和訪問日誌我們暫時不去接觸,加#註釋掉。

wKioL1XuhPXBjDn-AAGva2i_de4739.jpg

6.檢視有沒有錯誤:

命令:/usr/local/apache2/bin/apachectl -t


7.在windows系統下。

開啟C盤→ Windows→ System32→ drivers→ etc

找到hosts檔案,並用寫字板開啟它

並且在localhost name resolution is handled within DNS itself下新增

192.168.1.135 www.wyl.comwww.cyy.com


期間我遇到了一個小問題,就是hosts檔案無法寫入儲存。

解決方法很簡單:右擊hosts,屬性,安全,編輯,所有使用者的編輯成 允許即可

wKioL1XukMqz1Kl0AAGrNzCoiYE835.jpg


8.在windows系統的終端上ping兩個網站www.wyl.comwww.cyy.com

ping通即可

wKioL1XukbvREJp-AALsB1L7Ex8349.jpg

9.然後在瀏覽器中輸入www.wyl.com

然而並沒有想象中那麼順利,出現了好多問題。

第一個問題:

無法載入網頁!!!

原因:沒有啟動80埠,也就是apache沒有啟動

解決方案/usr/local/apache2/bin/apachectl restart


第二個問題:

wKioL1Xuk6jA6ZluAABhuvTnpBg349.jpg

403!403!403!403!403!403!403!403!403!403!403!403!

原因:我也不知道!!

解決方案:編輯一下主配置檔案vim /usr/local/apache2/conf/httpd.conf

將裡面有一段

<Directory />

Options FollowSymLinks

AllowOverride None

Order deny,allow

Deny from all

</Directory>

改成

<Directory />

Options FollowSymLinks

AllowOverride None

Order deny,allow

Allow from all

</Directory>


問題解決後就會出現這個頁面!!

wKioL1XumGzRlVitAAPl8vGke2U479.jpg

點選我同意後進入下一個頁面

wKiom1Xulomy1nzlAAL42mzP3O4222.jpg

出現這樣的情況,這麼多的目錄檔案的許可權不可寫,該怎麼辦呢?

我們來看看apache的程序是以哪個使用者的身份執行的

命令:ps aux | grep http

wKioL1Xumb7CX7EzAAM8qC0mdy0407.jpg

我們可以看出apache的程序是以daemon的使用者執行的。

那麼有兩種方法可以解決這個問題。

1.把這些目錄檔案的所屬主改成daemon;

2.把這些目錄檔案加上可寫許可權;


我建議用第一個方法,第二種方法太不安全了

命令:chown -R daemon config data uc_client/data uc_server/data

這樣問題就解決了:

wKioL1Xum1ij2jLWAALtt0y6i5c249.jpg


下一步,選擇第一項就行wKioL1Xum_WQmXFdAAGXMjSKG14174.jpg

下面就要開始安裝資料庫了

wKioL1XunH7BO8mVAAJiI0A5HPQ959.jpg

開始配置mysql

create database discuz

grant all on discuz.* to 'wangyl'@'localhost' identified by '密碼'
wKiom1XuoOTDxExZAAILs82Wm7A696.jpg

然後填寫資料

wKioL1Xuo9yjZ_xXAAKFKNGT6uY823.jpg


然後就是等待安裝完畢就行了

wKioL1XupDayytzwAAKmvvnz188051.jpg


6.1.apache使用者認證

有時候,我們需要給一些特殊的訪問設定一個使用者認證機制,增加安全。

比如我們剛剛安裝好的discuz論壇,是有一個管理後臺的。

雖然管理後臺本身就有密碼,但我們為了更加安全,可以再設定一層使用者認證。


首先開啟配置檔案

命令:vim/usr/local/apache2/conf/extraspacer.giftpd-vhosts.conf

在對應的虛擬主機配置中加入如下配置:
<Directory/data/www/任意的目錄或檔案>
AllowOverrideAuthConfig
AuthName"alksdjflkasjdf"
AuthTypeBasic
AuthUserFile/data/.htpasswd
requirevalid-user
</Directory>

首先指定要對哪個目錄進行驗證,AuthName自定義,AuthUserFile指定使用者密碼檔案在哪裡。

命令:/usr/local/apache2/binspacer.gifpasswd-cm/data/.htpasswd wangyl

這一步是要建立進行驗證的使用者。

第一次要幾個-c選項,目的是為了建立/data/.htpasswd密碼檔案,回車後輸入要設定的密碼就ok啦。

然後重啟apache服務
命令:/usr/local/apache2/bin/apachectl-t

先檢查配置是否正確
命令:/usr/local/apache2/bin/apachectlgraceful

6.2.預設虛擬主機

我們發現你在輸入虛擬主機的ip,或者在hosts裡面新增如何一個域名的時候,也能正常訪問discuz論壇,為了防止這個現象,我們這樣來進行。

wKioL1Xv6FngAXDSAAJgf7eKkSI249.jpg

我們在<VirtualHost *:80>上再建立一個,如下圖

wKiom1Xv5pzzmcRUAAJqyWwCKzQ925.jpg

建立配置中提到的目錄

命令:mkdir /tmp/tmp


其實這個預設虛擬主機就是配置檔案裡的第一個虛擬主機。

關於預設虛擬主機有個特點,凡是解析到這臺機器的域名,不管是什麼域名,只要在配置檔案中沒有配置,那麼都會訪問到這個主機上來。

舉例,我們直接用 ip 訪問,會訪問到這個站點上來。為了避免別人亂解析,所以應該把預設也就是第一個虛擬主機給禁止掉。

在這裡我們使用 allow,deny 語句,已經禁掉了,至於它的含義,後面會介紹。這時候,我們用 ip 去訪問,發現已經提示:

Forbidden

You don't have permission to access / on this server.


6.3.域名301跳轉

一個站點難免會有多個域名,而多個域名總得有一個主次。

比如我的網站可以用兩個

域名訪問:www.wyl.com和www.cyy.com

但大家發現不管我用哪個域名訪問,最終都會跳到www.wyl.com上來。

那麼,這個行為就叫做域名跳轉,這裡的301只是一個狀態碼,跳轉除了301外還有302。

下面我們來配置如何讓www.cyy.com跳轉到www.wyl.com。


進入虛擬主機的配置檔案

命令:vim/usr/local/apache2/conf/extraspacer.giftpd-vhosts.conf

在對應的虛擬主機配置檔案中加入
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{HTTP_HOST}^www.cyy.com$
RewriteRule^/(.*)$http://www.wyl.com/$1[R=301,L]
</IfModule>

如果是多個域名,可以這樣設定:
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{HTTP_HOST}^www.aaa.com[OR]
RewriteCond%{HTTP_HOST}^www.cyy.net$
RewriteRule^/(.*)$http://www.wyl.com/$1[R=301,L]
</IfModule>

或者:
<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{HTTP_HOST}!^www.wyl.com$
RewriteRule^/(.*)$http://www.wyl.com/$1[R=301,L]
</IfModule>


配置完檔案後,我們出來要檢視下rewrite模組有沒有加載出來。

命令:/usr/local/apache2/bin/apachectl -M

wKioL1XxMenS8rzcAAMrlBs20EU647.jpg

重啟apache後,在瀏覽器訪問www.cyy.com會直接跳轉到www.wyl.com。

如果想快速測試效果,其實可以直接在Linux命令列下使用curl命令。
命令:
curl-x127.0.0.1:80www.aminglinux.com/bbs/forum.php-I

wKioL1XxTw6ioNGOAAF6WJJGHUc644.jpg


6.4.Apache日誌切割

這裡的日誌指的是訪問日誌,我們每訪問一次網站,那麼就會記錄若干條日誌。

日誌如果不去管理,時間長了日誌檔案會越來越大。

我們如何避免產生這麼大的日誌檔案?其實,apache有相關的配置,使日誌按照我們的需求進行歸檔,比如每天一個新日誌,或者每小時一個新日誌。

那下面我們配置成按天歸檔日誌。
命令:
vim/usr/local/apache2/conf/extra/httpd-vhosts.conf
在對應的虛擬主機配置檔案中加入
ErrorLog"|/usr/local/apache2/bin/rotatelogs-l/usr/local/apache2/logs/wyl.com-error_%Y%m%d.log86400"
CustomLog"|/usr/local/apache2/bin/rotatelogs-l/usr/local/apache2/logs/wyl.com-access_%Y%m%d.log86400"combined

wKioL1XyUb6grcP_AALXvJR9QfI678.jpg

說明:

上面是兩行,注意不要寫成多於兩行。

ErrorLog是錯誤日誌,CustomLog是訪問日誌。

最前面的那個豎線其實就是管道符,意思是把產生的日誌交給rotatelogs這個工具,而這個工具就是apache自帶的切割日誌的工具。

-l的作用是校準時區為UTC,也就是北京時間。

最後面的86400,單位是秒,所以正好是一天,那麼日誌會每天切割一次。

而最後面的combined為日誌格式。

關於日誌格式在/usr/local/apcahe2/conf/httpd.conf裡面定義。

wKiom1XyVOqhJVktAAFncqAjFC0318.jpg

%h:來源IP

%l:

%u:使用者

%t:時間


6.5.Apache不記錄指定檔案型別日誌

如果一個站點訪問量特別大,那麼訪問日誌就會很多。

但有一些訪問日誌我們其實是可以忽略掉的,比如網站的一些圖片,還有 js, css 等靜態物件。

而這些檔案的訪問往往是巨量的,而且即使記錄這些日誌也沒有什麼用。

那如何忽略掉這些訪問的日誌呢?

SetEnvIf Request_URI ".*\.gif$" p_w_picpath-request

SetEnvIf Request_URI ".*\.jpg$" p_w_picpath-request

SetEnvIf Request_URI ".*\.png$" p_w_picpath-request

SetEnvIf Request_URI ".*\.bmp$" p_w_picpath-request

SetEnvIf Request_URI ".*\.swf$" p_w_picpath-request

SetEnvIf Request_URI ".*\.js$" p_w_picpath-request

SetEnvIf Request_URI ".*\.css$" p_w_picpath-request

CustomLog "|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/oem.discuz.qq.com-access_%Y%m%d.log 86400" combinedenv=!p_w_picpath-request

wKiom1Xye_fgL-LFAAQ4BKQ6_lQ237.jpg

說明:

在原來日誌配置的基礎上,增加了一些 p_w_picpath-request 的定義,比如把 gif、 jpg、bmp、 swf、 js、 css 等結尾的全標記為 p_w_picpath-request。

然後在配置日誌的時後加一個標記env=!p_w_picpath-request,這裡有個歎號,表示取反,這樣就可以把這些忽略了。


6.6.Apache 配置靜態快取

這裡的靜態檔案指的是圖片、 js、 css 等檔案,使用者訪問一個站點,其實大多數元素都是圖片、 js、 css 等,這些靜態檔案其實是會被客戶端的瀏覽器快取到本地電腦上的,目的就是為了下次再請求時不再去伺服器上下載,這樣就加快了速度,提高了使用者體驗。


但這些靜態檔案總不能一直快取,它總有一些時效性。

那麼這節我們講的就是這個過期時間。

配置如下:

<IfModule mod_expires.c>

ExpiresActive on

ExpiresByType p_w_picpath/gif "access plus 1 days"

ExpiresByType p_w_picpath/jpeg "access plus 24 hours"

ExpiresByType p_w_picpath/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>


或者使用 mod_headers 模組實現

<ifmodule mod_headers.c>

# htm,html,txt 類的檔案快取一個小時

<filesmatch "\.(html|htm|txt)$">

header set cache-control "max-age=3600"

</filesmatch>

# css, js, swf 類的檔案快取一個星期

<filesmatch "\.(css|js|swf)$">

header set cache-control "max-age=604800"

</filesmatch>

# jpg,gif,jpeg,png,ico,flv,pdf 等檔案快取一年

<filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">

header set cache-control "max-age=29030400"

</filesmatch>

</ifmodule>


說明:這裡的時間單位可以 days、 hours 甚至是 min。

兩種不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers。

要想使用這些模組,必須要事先已經支援。

如何檢視是否支援,使用命令:

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


6.7.Apache 配置防盜鏈

配置防盜鏈的作用就是防止別人在你的網站裡直接拿走圖片

SetEnvIfNoCase Referer "^http://.*\.apelearn\.com" local_ref

SetEnvIfNoCase Referer ".*\.aminglinux\.com" local_ref

SetEnvIfNoCase Referer "^$" local_ref

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

Order Allow,Deny

Allow from env=local_ref

</filesmatch>


6.8 Apache 訪問控制

在前面我們更改 httpd.conf 的時候就已經出現了 allow, deny 這兩個關鍵詞,其實這節最核心的東西就是這兩個。先來看看 allow 和 deny 的規則。


首先舉個例子

Order deny,allow

deny from all

allow from 192.168.1.135


我們判斷的依據是這樣的:

1. 看 Order 後面的,哪個在前,哪個在後

2. 如果 deny 在前,那麼就需要看 deny from 這句,然後看 allow from 這一句

3. 規則是一條一條的匹配的,不管是 deny 在前還是 allow 在前,都是會生效的。

比如例子中,先 deny 了所有,然後又 allow了192.168.1.135,所以192.168.1.135是通過的。


講完了 allow, deny 我們再來看看具體的應用吧。

1.某個目錄做限制,比如該目錄很重要,只允許我們公司的 ip 訪問,當然這個目錄可以是網站根目錄,也就是整個站點都要做限制了。

<Directory /data/www/>

Order deny,allow

Deny from all

Allow from 192.168.1.135

</Directory>

說明:只允許192.168.1.135訪問,其他 IP 全部拒絕掉。


2.針對請求的 uri 去限制,前面安裝的 discuz 論壇,訪問後臺是 admin.php,那我們就可以針對這個 admin.php 做限制。

<filesmatch "(.*)admin(.*)">

Order deny,allow

Deny from all

Allow from 192.168.1.135

</filesmatch>

說明:這裡用到了 filesmatch 語法,表示匹配的意思。


6.9.Apache 禁止解析 php

某個目錄下禁止解析 php,這個很有用,我們做網站安全的時候,這個用的很多,比如某些目錄可以上傳檔案,為了避免上傳的檔案有***,所以我們禁止這個目錄下面的訪問解析 php。

<Directory /data/www/data>

php_admin_flag engine off

<filesmatch "(.*)php">

Order deny,allow

Deny from all

</filesmatch>

</Directory>

說明: php_admin_flag engine off 這個語句就是禁止解析 php 的控制語句,但只這樣配置還不夠,因為這樣配置後用戶依然可以訪問 php 檔案,只不過不解析了,但可以下載,使用者下載 php 檔案也是不合適的,所以有必要再禁止一下。


6.10.Apache 禁止指定 user_agent

user_agent 我把它叫做瀏覽器標識。

這一小節主要針對這些 user_agent 來做一些限制。

配置如下:

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT}^.*curl* [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^*Firefox/4.0* [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^*Tomato Bot/1.0* [NC]

RewriteRule .* - [F]

</IfModule>

同樣是使用 rewrite 模組來實現限制指定 user_agent.

在本例中, RewriteRule .* - [F] 可以直接禁止訪問。

rewritecond 用 user_agent 來匹配, *Firefox/4.0* 表示,只要 user_agent 中含有 Firefox/4.0 就符合條件,其中*表示任意字元, NC 表示不區分大小寫, OR 表示或者,連線下一個條件。


假如我現在要把百度的搜尋引擎限制掉,可以加一條這樣的規則:

RewriteCond %{HTTP_USER_AGENT} ^*Baiduspider/2.0* [NC]

RewriteRule .* - [F]

既然有了或者 OR,那有沒有並且呢?你只要不寫 OR 就是並且的意思。


6.11.Apache 通過 rewrite 限制某個目錄

我們可以 allow 和 deny 去現在網站根目錄下的某個子目錄,當然這個 rewrite 也可以實現,配置如下:

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{REQUEST_URI} ^.*/目錄/* [NC]

RewriteRule .* - [F]

</IfModule>


7.1php.ini配置檔案詳解

有時候我們並不知道 php.ini 所在路徑,這時候就需要通過命令來查一查在哪裡。

命令:/usr/local/php/bin/php -i |head

wKiom1X6ZkCBNwaTAAP5kHuXgqc402.jpg

看那一行 Loaded Configuration File -> /usr/local/php/etc/php.ini。

如果這裡為 None,那麼就說明沒有載入到具體的 php.ini。

找到 php.ini 後,用 vim 開啟它,發現很多行都是以;開頭的,這個符號在 php.ini 中作為註釋符號,也就是說只要是以;開頭的行都是不起作用的。而php.ini 中常用的配置有如下:


1.配置 disable_function

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

wKioL1X6aQihybXUAAG2xNrdxJA423.jpg

說明:在 php 中有非常多的函式,在這些函式中有一些是不×××全的,所以有必要把它們禁 v 0 掉、 。像 exec, shell_exec 都是在 php 程式碼中執行 linux shell 命令,很危險,要禁掉。


2.配置 error_log

如果你是 php 開發人員,那我相信你會經常遇到除錯程式碼的情況,作為一個運維人員我們理應學會簡單的 php 錯誤排查技能,其實 php 的錯誤跟 linux 下其他服務都是一樣的,遇到錯誤後要檢視錯誤日誌,根據報錯資訊來判斷錯誤的原因。那如何檢視 php 的錯誤資訊呢?

遇到錯誤時,我們訪問網站通常會顯示白頁,什麼都沒有,狀態碼是 500。

那麼怎麼辦呢?

1.可以直接把錯誤資訊顯示在瀏覽器中,配置方法是,在 php.ini 中找到 display_error=on,重啟apache 服務後,重新整理網頁,發現不再是白頁,而是具體的錯誤。這樣我們就可以根據錯誤來除錯 php 程式碼了。這種情況適合臨時除錯,但是這種情況不適合長期配置,因為所有錯誤都會顯示在瀏覽器上,假如哪天 php 程式設計師不小心寫錯一段程式碼,而且沒測試直接上傳到伺服器上了,那麼我們的使用者就會直接看到這些錯誤,這樣是不合適的。

2.所以還有第二種情況,把錯誤資訊輸出到一個日誌檔案中,具體配置如下:

命令:vim /usr/local/php/etc/php.ini

加入或者更改

display_error=off

log_errors=on

error_log=/usr/local/php/logs/error.log

說明:該檔案一開始是不存在的,為了避免許可權問題不能自動生成該檔案,我們可以先建立該檔案,並且修改許可權為 777

error_reporting = E_ALL | E_STRICT

說明: 首先要把錯誤不再瀏覽器顯示,第二開啟錯誤日誌開關,然後指定錯誤日誌的路徑,最後是定義錯誤日誌的級別。配置完成後記得要重啟 apache 服務,才會生效。

3.配置 open_basedir

在 php 中是有這個 open_basedir 概念的,它的意思是,把執行 php 的使用者限定在指定的路徑下,這樣通過許可權縮小的方式達到安全目的。

作為一個網站,其實我們只需要讓 php使用者訪問到網站的程式碼即可,沒有必要讓它去訪問其他目錄。那如何配置呢?

命令:vim /usr/local/php/etc/php.ini

加入或者更改

open_basedir = /dir1/:/dir2

說明: /dir1 和/dir2 為我們允許 php 可以訪問的兩個目錄,同樣也可以是多個,目錄之間用:分隔。一旦限定後,如果 php 試圖去訪問除/dir1 和/dir2 外的目錄下的檔案時,就會報錯了。

錯誤類似於:Warning: file_exists() [function.file-exists]: open_basedir restriction in effect.File(../123.php) is not within the allowed path(s):

除了在 php.ini 中定義 open_basedir 外,其實我們還可以在 apache 的配置檔案中定義,因為一個 apache 下可能有多個站點,我們要針對不同的站點限定不同的 open_basedir,配置如下。

命令:vim httpd.conf 或者虛擬主機配置檔案

加入

php_admin_value open_basedir "/dir1/:/dir2/"


7.2php擴充套件模組如何安裝

檢視php編譯載入完的模組

命令:/usr/local/php/bin/php -m

當我們編譯完成php後,發現我們還需要讓php支援另外的模組。

我們有兩種安裝方式。

1.這時候可以重新編譯 php,加上配置引數;

2.或者直接編譯出一個獨立的模組檔案。然後讓php去呼叫它。


一般我們使用第二種安裝方式,那麼如何編譯呢?

首先先找到php的原始碼包

命令:cd /usr/local/src/php-5.4.36

wKioL1X6i4fhdNaFAAVJsPu1Ogc450.jpg

很多很多的原始碼包都在ext/目錄下:

wKiom1X6iYXyd7hsAAc0NxAIVp4337.jpg

如果目錄下沒有我們需要的模組,那麼我們就要去網上去下載一個

舉個例子,我們編譯一個curl模組

wKioL1X6jJzhnZrCAAOzSsmLvY0759.jpg

命令:/use/local/php/bin/phpize

該命令的作用是:是為了生成configue這個可執行檔案

wKioL1X6jXXAi9CvAAOsaEb3ZQU020.jpg

命令:./configue --with-php-config=/usr/local/php/bin/php-config

安裝時候出現一個小問題

wKiom1X6joqQriUnAARIoNqZKjU038.jpg

錯誤:configure: error: Please reinstall the libcurl distribution -easy.h should be in <curl-dir>/include/curl/

解決:yum install curl curl-devel


命令:make

命令:make install

執行完命令後,會把模組的檔案放在這個目錄下

/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/

wKiom1X6j9GS8PgHAANxQiGt_pE605.jpg

extension_dir是用來存放擴充套件模組的

命令:/usr/local/php/bin/php -i | grep extension_dir

轉載於:https://blog.51cto.com/358513922/1690494