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軟體,出現了下面這種情況:
然後我重新安裝了64位的mysql,出現了第二個問題:
這種情況是因為缺少lib庫檔案,只要安裝一下即可:
命令:yum install -ycompat-libstdc++-33
還有一種情況:
mysql初始化成功後會出現下面的情況:
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
但是,我卻出現了這樣的狀況!!
雖然不妨礙使用,可是看著錯誤總覺得彆扭。
經過查詢發現,這個問題應該是沒有在/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
作用:將一些靜態的模組還有一些動態的模組列出來
命令:/uer/local/apache2/bin/apachectl -l
作用:把靜態的模組列出來
命令:/uer/local/apache2/bin/apachectl -t
作用:檢視配置檔案有沒有語法錯誤。
那麼配置檔案在哪裡呢?
在這裡:ls /usr/local/apache2/conf/heepd.conf
重啟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/conftpd.conf
命令:vim/usr/local/apache2/conftpd.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。
我在安裝過程中有一個錯誤
這是因為我在配置/usr/local/apache2/conf/httpd.conf的時候
AddType application/x-httpd-php .php加一個空格
如果是正確的則顯示為“SyntaxOK”。
啟動apache的命令為:
命令:/usr/local/apache2/bin/apachectlstart
檢視是否啟動:
命令:netstat-lnp|grephttpd
如果有顯示這行,則啟動了。
也可以使用curl命令簡單測試:
命令:curllocalhost
只有顯示這樣才正確。
測試是否正確解析php:
命令:vim/usr/local/apache2/htdocs/1.php
寫入:
<?php
echo"php解析正常";
?>
儲存後,繼續測試:
命令:curllocalhost/1.php
看是否能看到如下資訊:
只有顯示這樣才正確。
六.搭建Discuz論壇
1.首先要去下載一個Discuz
官網:http://download.comsenz.com/DiscuzX/3.2/
2.建立一個目錄用來作為Discuz程式的根目錄
命令:mkdir /data/www
命令:cd /data/www
命令:wgethttp://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip
3.解壓一下壓縮包
命令:unzip Discuz_X3.2_SC_GBK.zip
4.將程式目錄下的檔案挪出來,並刪除程式目錄以外的所以程式
5.配置apache的配置檔案
命令:vim /usr/local/apache2/conf/httpd.conf
然後將虛擬主機開啟
然後編輯這個虛擬主機的配置檔案
命令:vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
將下面這個<VirtualHost *:80>刪除,再編輯上面的:
1.去掉第一行的管理員郵箱;
2.將第二行的DocumentRoot的絕對路徑改成/data/www;
3.ServerName改為:www.wyl.com(這個隨意,改成什麼都行)
4.ServerAlias改為:www.cyy.com(這個也隨意)
5.後面的錯誤的日誌和訪問日誌我們暫時不去接觸,加#註釋掉。
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,屬性,安全,編輯,所有使用者的編輯成 允許即可
8.在windows系統的終端上ping兩個網站www.wyl.comwww.cyy.com
ping通即可
9.然後在瀏覽器中輸入www.wyl.com
然而並沒有想象中那麼順利,出現了好多問題。
第一個問題:
無法載入網頁!!!
原因:沒有啟動80埠,也就是apache沒有啟動
解決方案:/usr/local/apache2/bin/apachectl restart
第二個問題:
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>
問題解決後就會出現這個頁面!!
點選我同意後進入下一個頁面
出現這樣的情況,這麼多的目錄檔案的許可權不可寫,該怎麼辦呢?
我們來看看apache的程序是以哪個使用者的身份執行的
命令:ps aux | grep http
我們可以看出apache的程序是以daemon的使用者執行的。
那麼有兩種方法可以解決這個問題。
1.把這些目錄檔案的所屬主改成daemon;
2.把這些目錄檔案加上可寫許可權;
我建議用第一個方法,第二種方法太不安全了
命令:chown -R daemon config data uc_client/data uc_server/data
這樣問題就解決了:
下面就要開始安裝資料庫了
開始配置mysql
create database discuz
grant all on discuz.* to 'wangyl'@'localhost' identified by '密碼'
然後填寫資料
然後就是等待安裝完畢就行了
6.1.apache使用者認證
有時候,我們需要給一些特殊的訪問設定一個使用者認證機制,增加安全。
比如我們剛剛安裝好的discuz論壇,是有一個管理後臺的。
雖然管理後臺本身就有密碼,但我們為了更加安全,可以再設定一層使用者認證。
首先開啟配置檔案
命令:vim/usr/local/apache2/conf/extratpd-vhosts.conf
在對應的虛擬主機配置中加入如下配置:
<Directory/data/www/任意的目錄或檔案>
AllowOverrideAuthConfig
AuthName"alksdjflkasjdf"
AuthTypeBasic
AuthUserFile/data/.htpasswd
requirevalid-user
</Directory>
首先指定要對哪個目錄進行驗證,AuthName自定義,AuthUserFile指定使用者密碼檔案在哪裡。
命令:/usr/local/apache2/binpasswd-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論壇,為了防止這個現象,我們這樣來進行。
我們在<VirtualHost *:80>上再建立一個,如下圖
建立配置中提到的目錄
命令: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/extratpd-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
重啟apache後,在瀏覽器訪問www.cyy.com會直接跳轉到www.wyl.com。
如果想快速測試效果,其實可以直接在Linux命令列下使用curl命令。
命令:curl-x127.0.0.1:80www.aminglinux.com/bbs/forum.php-I
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
說明:
上面是兩行,注意不要寫成多於兩行。
ErrorLog是錯誤日誌,CustomLog是訪問日誌。
最前面的那個豎線其實就是管道符,意思是把產生的日誌交給rotatelogs這個工具,而這個工具就是apache自帶的切割日誌的工具。
-l的作用是校準時區為UTC,也就是北京時間。
最後面的86400,單位是秒,所以正好是一天,那麼日誌會每天切割一次。
而最後面的combined為日誌格式。
關於日誌格式在/usr/local/apcahe2/conf/httpd.conf裡面定義。
%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
說明:
在原來日誌配置的基礎上,增加了一些 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
看那一行 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
說明:在 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
很多很多的原始碼包都在ext/目錄下:
如果目錄下沒有我們需要的模組,那麼我們就要去網上去下載一個
舉個例子,我們編譯一個curl模組
命令:/use/local/php/bin/phpize
該命令的作用是:是為了生成configue這個可執行檔案
命令:./configue --with-php-config=/usr/local/php/bin/php-config
安裝時候出現一個小問題
錯誤: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/
extension_dir是用來存放擴充套件模組的
命令:/usr/local/php/bin/php -i | grep extension_dir
轉載於:https://blog.51cto.com/358513922/1690494