在前面的一篇博客中,我已經介紹過,如何通過源碼編譯安裝LAMP,見
教你源碼編譯制作LAMP詳細過程  ,這里就介紹下如何編譯安裝LNMP,以及如何在LNMP中添加ssl認證。LNMP,也叫做LEMP。L,即linux操作系統;N,即nginx,因其讀作engine x,所以也成為LEMP;M,即MySQL;P,即Php等腳本語言。說白了,LNMP也是個組合。只不過將LAMP中的Apache換成了Nginx而已,但別看僅僅是名字的替換,這個替換可是有著巨大的意義。他們實現的功能雖說差異不大,但它們背后的實現機制還是有很多區別的。因在上篇博客中已經介紹過了其他幾個,這里就主要介紹nginx了。那我們一塊來認識下nginx到底是何方神圣吧。
Nginx(發音同 engine x)是一款由俄羅斯程序員 Igor Sysoev所開發輕量級的網頁服務器、反向代理服務器以及電子郵件( IMAP/POP3)代理服務器。起初是供俄國大型的門戶網站及搜索引擎 Rambler(俄語: Рамблер)使用。此軟件在 BSD-like協議下發行,可以在 UNIX、 GNU/Linux、 BSD、 Mac OS X、 Solaris,以及 Microsoft Windows等操作系統中運行。因它的高性能、穩定性、豐富的特性、簡單方便的配置和低系統資源的消耗而聞名。因其占有內存少,并發能力強等眾多優點,廣受各大門戶網站的喜愛。中國大陸使用 nginx網站用戶有:新浪、網易、 騰訊等。下圖是 netcraft 網站統計的在所有領域的頂級服務器市場份額 的相關信息,通過該圖,我們可以對nginx有個初步的了解。
從上圖,可以看到,apache因其成熟的技術、強大的功能及開源特性依然占據著服務器市場的半壁江山,但其市場份額卻很不穩定;而nginx從其出現開始,一直保持其增長趨勢,到目前為止,其市場份額已達12.18%。預計,在未來幾年,由于nginx的眾多優點,nginx的市場份額還會繼續增長。那究竟是什么原因讓nginx從其出現就保持強勁增長呢?要回答清楚這個問題,且聽我一一分解。首先,先看一下nginx都有哪些特性,只有知道其特性才更容易理解。
Nginx 是一個很強大的高性能 Web和反向代理服務器,它具有很多非常優越的特性: 
在高連接并發的情況下, Nginx是 Apache服務器不錯的替代品: Nginx在美國是做虛擬主機生意的老板們經常選擇的軟件平臺之一。能夠支持高達  50,000 個并發連接數的響應。 
Nginx作為負載均衡服務器: Nginx 既可以在內部直接支持  Rails 和  PHP 程序對外進行服務,也可以支持作為  HTTP代理服務器對外進行服務。 Nginx采用 C進行編寫,不論是系統資源開銷還是 CPU使用效率都比  Perlbal 要好很多。 
作為郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作為郵件代理服務器)。 
Nginx 是一個安裝非常的簡單,配置文件非常簡潔(還能夠支持 perl語法), Bugs非常少的服務器: Nginx 啟動特別容易,并且幾乎可以做到 7*24不間斷運行,即使運行數個月也不需要重新啟動。你還可以再不間斷服務的情況下進行軟件版本的升級。 
nginx可以做網頁服務器,反向代理服務器,同時還可以做電子郵件代理服務器,這里我們主要介紹其網頁服務器,其他服務器特性這里暫不介紹。
單進程、多進程及線程在多請求到來時的比較: 單進程:僅接受一個請求,其他請求阻塞,直到完成才響應下一個請求
多進程:每個進程響應一個請求
 ? ? 進程量大,進程切換次數過多
 ? ? 每個進程的地址空間是獨立的,很多空間是重復的數據,所以內存使用效率較低
線程:每個線程響應一個請求,但因linux對線程支持不夠,故
 ? ? 線程依然需要切換:切換較之進程屬于輕量級切換
 ? ? 同一個進程的線程可以共享進程的諸多資源,比如打開的文件
 ? ? 對內存的需求較之進程略有下降
 ? ? 快速切換時會帶來線程抖動傳統上基于進程或線程模型架構的web服務通過每進程或每線程處理并發連接請求,這勢必會在網絡和I/O操作時產生阻塞,其另一個必然結果則是對內存或CPU的利用率低下。生成一個新的進程/線程需要事先備好其運行時環境,這包括為其分配堆內存和棧內存,以及為其創建新的執行上下文等。這些操作都需要占用CPU,而且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步下降。同時由于傳統的web服務器是基于進程或線程模型架構的,在處理C10K(當我們的并發連接達到10K時,會出現眾多問題,由此稱為C10K)問題時,顯得很吃力,不能很好地處理高并發的請求。而因nginx工作在AIO(異步I/O)模型下,且支持內存映射、事件驅動,因此,nginx很好的解決了這個問題。
在設計的最初階段,nginx的主要著眼點就是其高性能以及對物理計算資源的高密度利用,因此其采用了不同的架構模型。受啟發于多種操作系統設計中基于“事件”的高級處理機制,nginx采用了模塊化、事件驅動、異步、單線程及非阻塞的架構,并大量采用了多路復用及事件通知機制。在nginx中,連接請求由為數不多的幾個僅包含一個線程的進程worker以高效的回環(run-loop)機制進行處理,而每個worker可以并行處理數千個的并發連接及請求。Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,并主要通過“共享內存”的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。
主進程主要完成如下工作:
1. 讀取并驗正配置信息;
2. 創建、綁定及關閉套接字;
3. 啟動、終止及維護worker進程的個數;
4. 無須中止服務而重新配置工作特性;
5. 控制非中斷式程序升級,啟用新的二進制程序并在需要時回滾至老版本;
6. 重新打開日志文件,實現日志滾動;
7. 編譯嵌入式perl腳本;
worker進程主要完成的任務包括:
1. 接收、傳入并處理來自客戶端的連接;
2. 提供反向代理及過濾功能;
3. nginx任何能完成的其它任務;cache loader進程主要完成的任務包括:
1. 檢查緩存存儲中的緩存對象;
2. 使用緩存元數據建立內存數據庫;
cache manager進程的主要任務:
1. 緩存的失效及過期檢驗;Nginx的配置有著幾個不同的上下文:main、http、server、upstream和location(還有實現郵件服務反向代理的mail)。配置語法的格式和定義方式遵循所謂的C風格,因此支持嵌套,還有著邏輯清晰并易于創建、閱讀和維護等優勢。Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用于啟用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分為事件模塊、階段性處理器、輸出過濾器、變量處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用于提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。
在nginx內部,進程間的通信是通過模塊的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模塊來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream服務器通信,以及與memcached建立會話等。
上邊介紹了這么多關于nginx的知識,不知你是否了解了nginx。下面我們就一塊來安裝LNMP吧。
實驗壞境: 系統:rhel6.4系統內核:linux-2.6.32-358.el6.i686平臺在VMware虛擬機上實現。虛擬機IP:172.16.32.50所需要的軟件包:nginx-1.4.1.tar.gz,mysql-5.6.10-linux-glibc2.5-i686.tar.gz,php-5.4.13.tar.bz2,xcache-3.0.1.tar.bz2(提供php加速)擴展rpm包:libev-4.03-3.el6.i686.rpm,libmcrypt-devel-2.5.8-9.el6.i686.rpm,mhash-devel-0.9.9.9-3.el6.i686.rpm,libev-devel-4.03-3.el6.i686.rpm,mcrypt-2.6.8-10.el6.i686.rpm,libmcrypt-2.5.8-9.el6.i686.rpm ? mhash-0.9.9.9-3.el6.i686.rpm解決依賴關系:安裝開發組"Development Tools"和 "Development Libraries",安裝pcre-devel,bzip2-devel,libcurl-devel,libxml2-devel,openssl-devel在開始我們的安裝前,請先同步時間。否則,因你虛擬機的時間不是現在的時間,可能是過去的某個時間,因此當你安裝某個軟件包時,你會發現該軟件包來自未來。service ntpd stop ntpdate 172.16.0.1 ? #同步時間,該IP是本地的默認網關,可與外部網絡通信,這里是與其同步時間,讀者可自行設定crontab -e ? #為了避免以后還要同步時間,這里添加了任務計劃,沒3分鐘同步一次,將同步后的結果都送到/dev/null中,否則會每3分鐘收到一封信*/3 * * * * /sbin/ntpdate 172.16.0.1 &> /dev/null ? ?接下來,下載所需要的各軟件包,并配置好yum源。各軟件包的可在epel網站下載,這里僅給出鏈接,不再給出各個附件,請各位自行下載。這里我們將下載好的各軟件包放在了/root目錄下。在/root目錄下,除了上邊提到的軟件包之外,不要有其他rpm包,在當前目錄下,執行如下命令:yum grouplist   #查看安裝的組,假如你沒有安裝"Development Tools"和 "Server Platform Development",請執行下面的命令
yum -y groupinstall "Development Tools"  "Server Platform Development"  #安裝開發工具和服務器端開發平臺
yum -y --nogpgcheck localinstall *rpm   #安裝本地當前目錄下所有的rpm包
yum -y pcre-devel bzip2-devel libcurl-devel libxml2-devel openssl-devel  #確保以配置好yum源,然后安裝所依賴的各軟件包,否則后邊編譯安裝時會報錯
yum -y groupinstall "Compatibility libraries"   #這個是兼容庫,兼容一些老版本的庫,如果需要可以安裝,不需要可不安裝,這里沒有安裝該兼容庫
準備工作已經完畢,現在開始編譯安裝我們的各個軟件。
安裝nginx: groupadd -r nginx    #創建nginx系統組
useradd -r -g nginx nginx    #添加用戶nginx,實現以nginx用戶身份運行nginx服務進程
tar xf nginx-1.4.1.tar.gz   #解壓該文件
cd nginx-1.4.1
./configure \              #在相應目錄下執行該命令,其中\表示續行符--prefix=/usr \           #指定安裝文件目錄,安裝完畢后會在此目錄下生成一個html目錄--sbin-path=/usr/sbin/nginx \                  #nginx的可執行程序路徑--conf-path=/etc/nginx/nginx.conf \          #指定配置文件所在路徑--error-log-path=/var/log/nginx/error.log \     #錯誤日志所在路徑--http-log-path=/var/log/nginx/access.log \    #訪問日志所在路徑--pid-path=/var/run/nginx/nginx.pid  \          #pid文件所在路徑--lock-path=/var/lock/nginx.lock \                #鎖文件所在路徑--user=nginx \                                           #指定運行nginx服務的用戶,知道為何創建nginx用戶了吧--group=nginx \                                        #指定運行nginx服務的組--with-http_ssl_module \                           #啟用ssl模塊--with-http_flv_module \                           #啟用flv模塊--with-http_stub_status_module \              #啟用stub狀態模塊--with-http_gzip_static_module \                #啟用gzip靜態模塊--http-client-body-temp-path=/var/tmp/nginx/client/ \       #指定客戶端報文主體緩存的臨時文件目錄--http-proxy-temp-path=/var/tmp/nginx/proxy/ \              #指定代理臨時文件路徑--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \                #指定fastcgi臨時文件路徑--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \               #指定uwsgi臨時文件路徑--http-scgi-temp-path=/var/tmp/nginx/scgi \                     #指定scgi臨時文件路徑--with-pcre \                                                                 #啟用pcre--with-file-aio                                                               #啟用文件aio功能
如果想了解更多選項的意義,可在nginx-1.4.1目錄下,執行./configure --help命令查看。這里不再過多的介紹。
make && make install
安裝完畢后,為我們的nginx提供SysV風格的服務腳本:
vim /etc/init.d/nginx     #編輯該文件
#!/bin/sh             #這里是/bin/sh,不是/bin/bash,千萬不要寫錯了
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf        #nginx配置文件
# config:      /etc/sysconfig/nginx        #服務腳本的配置文件
# pidfile:     /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions               #讀取系統自帶的函數
# Source networking configuration.
. /etc/sysconfig/network            #讀取網絡配置
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0     #判斷時候啟用網絡功能,如果沒有返回0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx     #如果存在服務腳本的配置文件,則讀取該文件
lockfile=/var/lock/subsys/nginx                  #設定鎖文件
make_dirs() {                       #定義函數,創建相關目錄# make required directoriesuser=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`options=`$nginx -V 2>&1 | grep 'configure arguments:'`for opt in $options; doif [ `echo $opt | grep '.*-temp-path'` ]; thenvalue=`echo $opt | cut -d "=" -f 2`if [ ! -d "$value" ]; then# echo "creating" $valuemkdir -p $value && chown -R $user $valuefifidone
}
start() {[ -x $nginx ] || exit 5[ -f $NGINX_CONF_FILE ] || exit 6make_dirsecho -n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval
}
stop() {echo -n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval
}
restart() {configtest || return $?stopsleep 1start
}
reload() {configtest || return $?echo -n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo
}
force_reload() {restart
}
configtest() {$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {status $prog
}
rh_status_q() {rh_status >/dev/null 2>&1
}
case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart|configtest)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit 2
esac
保存退出。
chmod +x /etc/init.d/nginx   #為該腳本賦予執行權限
chkconfig --add nginx   #將nginx添加至服務列表
chkconfig nginx on       #讓nginx開機自啟動
service nginx start      #啟動nginx服務,進行測試
在物理機上測試一下吧。
可能有些人在啟動nginx服務,即執行service nginx start命令時出現如下錯誤:
出現此問題,是因為你本地的80端口已經被占用了,這時候,你可使用netstat -tnlp命令查看下,本地是否已經啟用了80端口,一般來說都是本地自動啟動了httpd服務,導致80端口被占用造成的錯誤。因為httpd和nginx使用的是同一個端口80。查看及解決辦法如下圖所示:
然后在測試就可以出現歡迎界面了。你也可以為其提供一個主機面,不顯示自帶的歡迎界面。到此,我們的nginx安裝完畢。先一塊來看下nginx的配置文件的信息,這里我們只貼出待會我們要用到的信息,介紹,有些是默認注釋掉的,我們也一塊介紹下。/etc/nginx/nginx.conf文件部分信息
worker_processes  1;     #工作進程個數,默認為1,可自行修改,但要看你服務器的性能如何
#error_log  logs/error.log;
#error_log  logs/error.log  notice;         #定義錯誤日志,我們在編譯安裝是已指定過,因此,這里默認是注釋掉的
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;                      #pid文件,編譯安裝時,已指定過,這里默認為注釋掉了
events {worker_connections  1024;              #事件驅動模型中,工作進程單個最大連接數,系統最大連接總數為worker_processes*worker_connections
}
http {                        #http服務段include       mime.types;                #支持mime類型,已支持非文本格式default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#keepalive_timeout  0;keepalive_timeout  65;        #持續連接超時時長#gzip  on;server {                   #服務段設置listen       80;                   #監聽端口server_name  localhost;          #服務名#charset koi8-r;#access_log  logs/host.access.log  main;location / {               #相當于httpd服務配置文件的<Directory />段root   html;           #相當于httpd服務配置文件的DocumentRoot配置段,用來定義web文檔所在目錄,是相對路徑,相對于/usr/html而言index  index.html index.htm;         #定義web文檔類型}#error_page  404              /404.html;       #定義錯誤頁面,默認沒有啟用,也沒有此頁面# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;        #定義錯誤代碼界面location = /50x.html {                 #如果匹配到該界面,顯示該界面信息,該文件內容見下圖root   html;      }# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {                     #php段,默認是注釋掉的,待會我們安裝完php后就需要啟用該段#    root           html;#    fastcgi_pass   127.0.0.1:9000;             #監聽的地址及端口號#    fastcgi_index  index.php;                     #指定類型為php#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;                #其他相關配置在該文件中設定#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {                    #虛擬主機配置,可使用基于虛擬主機訪問,這里我們不使用基于虛擬主機訪問,僅使用基于IP的訪問,默認是注釋掉的,假如你想使用基于虛擬主機的訪問,可啟用此段#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {                   #基于https的服務,默認為注釋掉的,待會使用CA時就需要啟用該段了#    listen       443;         #監聽的端口#    server_name  localhost;#    ssl                  on;                   #是否啟用ssl認證#    ssl_certificate      cert.pem;             #ssl認證的證書所在文件#    ssl_certificate_key  cert.key;           #ssl認證的密鑰文件#    ssl_session_timeout  5m;                #ssl會話超時時長#    ssl_protocols  SSLv2 SSLv3 TLSv1;           #ssl支持的協議#    ssl_ciphers  HIGH:!aNULL:!MD5;               #ssl認證使用的加密算法#    ssl_prefer_server_ciphers   on;                 #啟動服務器ssl認證#    location / {                               #        root   html;#        index  index.html index.htm;#    }#}
}
location段各字符含義備注 :
location [=|~|~*|^~] uri {}
location uri {};
 ? ? 對當前路徑及子路徑下的所有對象都生效
location = uri {};
 ? ? 精確匹配指定的路徑,不包括子路徑,因此,只對當前資源生效;
location ~ uri {}; ? ?
location ~* uri {};
 ? ? 模式匹配uri,此處的uri可使用正則表達式,與~的區別是:~區分字符大小寫,~*不區分字符大小寫;
location ^~ uri {};
 ? ? 不使用正則表達式;
優先級由高到低:= > ^~ > ~*|~ > 空(當省略=|~|~*|^~時即為空)/usr/html/50x.html文件顯示內容如下圖:配置文件介紹完畢,我們先去自己添加個個人主頁測試下再說吧。cd /etc/nginx/        #進入該目錄
cp nginx.conf nginx.conf.bak       #先做個備份,到時候修改完了還可以恢復過來
vim nginx.conf               #編輯該文件location / {                  #修改該段root   /web/html;            #修改默認設置,然后指定web文檔根目錄index  index.html index.htm;}
mkdir /web/html   #創建該目錄,作為我們的根目錄
vim /web/html/index.html       #編輯該文件,添加如下信息
<h1>http://lq2419.blog.51cto.com/</h1>保存退出。然后重新載入nginx服務。說到這里,不管前面有沒有提到,介紹一個nginx很重要的特性。就是nginx服務在線時,可實現不需重啟服務即可實現修改其配置,且新配置會在下次響應請求時自動啟用。假如現在nginx正在響應請求,但我們對nginx的配置進行了修改,則正響應的請求依然使用原來的配置。當響應完畢后,再有新的請求到來時,使用新的配置進行響應。service nginx reload ? #重新載入nginx服務
下圖是顯示效果:
到此,nginx已經介紹完畢。等安裝完畢所有的軟件再來介紹其他功能。
安裝mysql: 在前面的博客中,我已經介紹過如何安裝mysql了,這里本不想在重復介紹如何編譯安裝mysql了,但由于安裝環境不同,加上一些人呢懶得去打開另一個網頁,這里就在啰嗦一遍,重新介紹下如何編譯安裝mysql,同時,將自己在創建邏輯卷及安裝過程中遇到的問題及解決辦法一并分享一下。假如你在創建邏輯卷時沒有遇到什么問題,就當我在說廢話,下面兩個問題可以忽略。
問題一 :先分享一下我在創建邏輯卷時遇到的一個問題吧。虛擬機是通過克隆生成的一個虛擬機,原虛擬機安裝的rhel6.4的32位系統,添加了兩塊磁盤,一個SCSI口的磁盤,大小為120G,一個IDE口磁盤(后來又添加的),大小為20G,內存大小為256M。由于是第一次在rhel6.4的32位系統上安裝mysql-5.6.10版本,我們知道,為了數據的安全及因數據增加讓磁盤空間具有可擴展性,需創建邏輯卷來保存我們的數據。本人在創建邏輯卷時,在命令行界面輸入的fdisk /dev/sda,查看磁盤分區情況后沒發現什么問題,顯示的大小也是128G多,然后執行的分區、修改磁盤類型等一步步操作完成后,在還沒保存退出時,使用p選項查看磁盤分區情況,顯示的是/dev/sda2,一切正常,保存退出。在執行partprobe /dev/sda系統提示錯誤,說磁盤有問題,需重啟。檢查各種地方都沒有發現錯誤后,沒有辦法只好重啟。就reboot了,但當我重啟后,使用fdisk -l命令發現我剛創建的磁盤分區/dev/sda2現在居然變成了/dev/sdb2,很是郁悶。好吧,我認了,重啟過了,也就沒必要執行partprobe /dev/sdb命令了。執行fdisk -l查看一切正常后,創建物理卷、卷組、邏輯卷,然后一切才算正常。所以,總結出來假如在分區過程過遇到類型提示你必須重啟的問題,那就果斷重啟吧。不要浪費我們寶貴的時間了。IT人傷不起啊。
問題二 :這個是同學遇到的問題。暫時還沒有解決,對于為何會出現此問題僅僅是猜測。其實這個問題不應該在這里就提,應該更早些就分享出來。發現這個問題也是在準備去創建邏輯卷時出現的。先說下問題時什么吧。我與同學用的是同一個rhel6.4的引導盤,安裝的鏡像文件也是同一個,唯一不同的是我創建了兩個磁盤,而同學就創建了一個120G的SCSI磁盤,沒有要IDE磁盤。在rhel6.4上執行fdisk -l命令讓人不爽的是系統上所有磁盤分區,包括創建的所有邏輯卷都會顯示出來,系統自動創建的邏輯卷忒多,顯示信息太多,讓人看得眼花繚亂。他在執行fdisk -l命令查看磁盤分區情況時,還是給個圖片吧:結合我們兩個的虛擬機猜測,可能是因為安裝該系統就需要兩個磁盤,而同學正好就按了一個磁盤造成的緣故,目前此問題還沒有解決。以下是kickstart里與此相關的內容,不知是否與此有關,貼出來供高手參考,還請高手指點:
zerombr yes
clearpart --all
part /boot --fstype=ext4 --size=200
part pv.008 --size=61440
volgroup vg0 --pesize=8192 pv.008logvol / --fstype=ext4 --name=root --vgname=vg0 --size=20480logvol swap --name=swap --vgname=vg0 --size=2048logvol /usr --fstype=ext4 --name=usr --vgname=vg0 --size=10240logvol /var --fstype=ext4 --name=var --vgname=vg0 --size=20480
廢話不多說,繼續我們上邊的安裝吧。 
先創建我們的邏輯卷。本地是磁盤分區/dev/sdb2,所以直接創建物理卷、卷組、邏輯卷。pvcreate /dev/sdb2     #創建物理卷
vgcreate myvg /dev/sdb2    #創建卷組,卷組名為myvg
lvcreate -n mydata -L 10G myvg    #在卷組上創建邏輯卷,大小為10G,卷標為mydata
lvs     #查看創建的邏輯卷信息
mke2fs -j /dev/myvg/mydata    #格式化該邏輯卷
mkdir /mydata  #創建該目錄,用于掛載我們的邏輯卷
vim /etc/fstab   #編輯該文件,添加如下該行信息,將我們的創建的邏輯卷掛載至/mydata目錄下
/dev/myvg/mydata       /mydata          ext3    defaults    0 0
mount -a    #掛載所有磁盤分區
然后創建mysql用戶mysql組。
groupadd -r mysql    #創建mysql組
useradd -r -g mysql mysql   #創建mysql系統用戶
mkdir /mydata/data       #創建該目錄,用于存放我們mysql 的數據文件
chown -R mysql.mysql /mydata/data    #修改該文件及子文件為mysql屬主屬組,方便mysql寫入數據
tar xf mysql-5.6.10-linux-glibc2.5-i686.tar.gz -C /usr/local/    #解壓該文件到指定目錄,確保當前處于mysql壓縮文件所在目錄
ln -sv mysql-5.6.10-linux-glibc2.5-i686 mysql          #創建mysql-5.6.10-linux-glibc2.5-i686到mysql的鏈接
cd /usr/local/mysql    #進入該目錄
scripts/mysql_install_db --user=mysql --datadir=/mydata/data   #--user指定我們的mysql服務器創建的文件及目錄以哪個用戶運行,--datadir指定我們的數據文件所在目錄,這里mysql不需要執行./configure命令
完成后在當前目錄下會生成一個my.cnf的文件,這就是我們的配置文件,直接編輯。
vim my.cnf
datadir = /mydata/data   #修改我們的數據文件存放位置
socket = /tmp/mysql.sock   #添加套接字文件所在路徑
innodb_file_per_table=ON    #啟用每表一個表空間
保存退出。同樣,為我們的mysql服務提供服務腳本。這里我們使用系統自帶的,我們不需修改即可使用。
cp support-files/mysql.server  /etc/rc.d/init.d/mysqld   #將該目錄下的腳本拷貝到指定目錄下,并重命名
vim /etc/profile.d/mysql      #編輯該文件,添加環境變量
export PATH=$PATH:/usr/local/mysql/bin  #添加環境變量,讓系統直接使用mysql的命令
同樣,將該服務腳本添加到服務列表。
chkconfig --add mysql     #添加該服務腳本至服務列表
chkconfig mysql on    #設置開機啟動,默認級別為2345
service mysql start   #開啟mysql服務
netstat -tunlp     #查看我們的mysql服務端口是否已開啟,默認mysql監聽在3306端口
現在為我們的mysql創建幫助手冊,并添加其開發組件至系統。
在我們的mysql目錄下,有個man目錄,其下就是mysql的幫助手冊了。
vim /etc/man.config   #編輯該文件,添加如下一行信息
MANPATH  /usr/local/mysql/man
ln -sv /usr/local/mysql/include /usr/include/mysql  #創建符號鏈接,輸出mysql的頭文件至系統頭文件路徑
echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf   #添加該行信息,輸出mysql的庫文件給系統庫查找路徑
ldconfig     #讓系統重新載入系統庫
進入mysql測試下。
mysql -uroot -p     #通過以root身份進入mysql,下圖為測試效果
到此,mysql安裝完畢。
安裝php :在準備階段,我們已經安裝過libmcrypt,
libmcrypt-devel, mhash, mhash-devel, mcrypt, libev, libev-devel軟件包,現在,我們只需解壓php,編譯安裝即可。 tar xf php-5.4.13.tar.bz2
cd php-5.4.13
./configure   \
--prefix=/usr/local/php  \                            #安裝文件所在目錄
--with-mysql=/usr/local/mysql    \               #mysql文件所在目錄
--with-openssl      \                                    #啟用openssl認證功能
--enable-fpm  \                                          #支持fpm
--enable-sockets  \                           
--enable-sysvshm  \
--with-mysqli=/usr/local/mysql/bin/mysql_config  \
--enable-mbstring  \
--with-freetype-dir  \
--with-jpeg-dir     \
--with-png-dir      \
--with-zlib-dir      \
--with-libxml-dir=/usr      \
--enable-xml  \
--with-mhash  \                         #啟用mhash擴展
--with-mcrypt   \                        #啟用mcrypt擴展
--with-config-file-path=/etc  \
--with-config-file-scan-dir=/etc/php.d   \
--with-bz2 --with-curl
make  && make install
完成后為php提供配置文件。
cp php.ini-production /etc/php.ini
為php-fpm提供Sysv init腳本,并將其添加至服務列表:
cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
為php-fpm提供配置文件:
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
編輯php-fpm的配置文件,修改如下內容:
vim /usr/local/php/etc/php-fpm.conf
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php/var/run/php-fpm.pid
配置完成后,啟動php-fpm服務。
service php-fpm start
ps aux | grep php-fpm   #查看該進程,顯示如下
root      4132  0.0  1.1 104036  2984 ?        Ss   May18   0:03 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)                                                         
nobody    4133  0.0  1.9 104564  4916 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4134  0.0  2.1 104564  5260 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4135  0.0  1.9 104564  4948 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4136  0.0  1.9 104564  4960 ?        S    May18   0:00 php-fpm: pool www                                                                                                 
nobody    4137  0.0  1.9 104564  4948 ?        S    May18   0:00 php-fpm: pool www
php安裝完畢。現在去修改nginx配置文件,整合nginx和php。
vim /etc/nginx/nginx.conf   #編輯該文件,啟用如下選項,上邊已經介紹個各選項含義,這里直接修改location ~ \.php$ {root           /web/html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi_params;}location / {root   /web/html;index  index.php index.html index.htm;    #添加index.php}
vim /etc/nginx/fastcgi_params   #編輯該文件,刪除里邊所有信息,添加如下信息
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
修改完畢后,保存退出。重新裝載nginx服務。
service nginx reload
修改我們剛才建的主界面,添加幾行信息:
vim /web/html/index.html
<h1>http://lq2419.blog.51cto.com/</h1>
<?php
phpinfo();          #添加php相關的信息
?>
mv /web/html/index.html /web/html/index.php添加完成,現在去我們的物理機上測試下,看下效果。一切OK,搞定。
現在我們去安裝xcache加速。
安裝xcache :tar xf xcache-3.0.1.tar.bz2
cd xcache-3.0.1/usr/local/php/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make && make install
現在去整合php和xcache。
mkdir /etc/php.d
cp xcache.ini /etc/php.d
vim /etc/php.d/xcache.ini   #編輯該文件,添加如下一行信息,如果php.ini文件中有多條zend_extension指令行,要確保此新增的行排在第一位
extension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/xcache.so
啟用php-fpm服務:
service php-fpm restart在物理機上,在測試下。
xcache添加完畢。到此,LNMP制作完畢,就是那么簡單。你成功了么?
SSL認證 :貌似,童話故事到現在了還差個人物嘞。好吧,現在我們去添加CA認證。首先,生成自簽證書。在生成自簽證書前,為了我們待會方便,先去修改配置文件vim /etc/pki/tls/openssl.conf   #編輯該文件,修改如下內容
[ req_distinguished_name ]
countryName_default             = CN
stateOrProvinceName_default     = Henan
localityName_default    = Zhengzhou
0.organizationName_default      = MageEdu
organizationalUnitName_default  = Tech
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem     #有x509表示生成自簽證書Country Name (2 letter code) [CN]:State or Province Name (full name) [Henan]:Locality Name (eg, city) [Zhengzhou]:Organization Name (eg, company) [MageEdu]:Organizational Unit Name (eg, section) [Tech]:Common Name (eg, your name or your server's hostname) []:lq2419.langdu.comEmail Address []:lq2419@langdu.com
touch index.txt serial
echo 01 > serial
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
(umask 077;openssl genrsa -out nginx.key 1024)
openssl req -new -key nginx.key -out nginx.csr     #沒有x509表示生成證書請求Country Name (2 letter code) [CN]:State or Province Name (full name) [Henan]:Locality Name (eg, city) [Zhengzhou]:Organization Name (eg, company) [MageEdu]:Organizational Unit Name (eg, section) [Tech]:Common Name (eg, your name or your server's hostname) []:www.langdu.comEmail Address []:www@magedu.comPlease enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:An optional company name []:
openssl ca -in nginx.csr -out nginx.crt -days 3650    #生成證書
證書生成完成后,編輯我們的nginx配置文件,啟用ssl認證功能。
vim /etc/nginx/nginx.conf    #編輯該文件,啟用如下選項,并添加部分內容server {listen       443;server_name  localhost;ssl                  on;ssl_certificate      /etc/nginx/ssl/nginx.crt;      #證書所在路徑ssl_certificate_key  /etc/nginx/ssl/nginx.key;    #密鑰所在路徑ssl_session_timeout  5m;ssl_protocols  SSLv2 SSLv3 TLSv1;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers   on;location / {root   /web/html;           #修改根所在路徑index  index.php index.html index.htm;}location ~ \.php$ {              #添加此段,已支持phproot           /web/html;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi_params;}}
保存退出。重新載入nginx服務。
service nginx reload現在再去我們的物理機上測試一下吧。好了,現在ssl認證功能也已實現。到此。LNMP和CA認證均已完成。公主和王子終于可以在一起了,從此過上了……
 
 
轉載于:https://blog.51cto.com/lq2419/1204480
創作挑戰賽 新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
                            
總結 
                            
                                以上是生活随笔 為你收集整理的LNMP与CA认证的童话故事 的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。