LNMP架構及應用
LNMP代表的就是:Linux系統下Nginx+MySQL+PHP這種網站服務器架構。
Nginx是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理服務器。
有以下優勢:
作爲web服務器,nginx處理靜態文件、索引文件,自動索引的效率非常高;
作爲代理服務器,nginx可以實現無緩存的反向代理加速,提高網站的運行速度;
作爲負載均衡服務器,nginx既可以在內部直接支持Rails和PHP,也可以支持HTTP代理服務器對外進行服務,同時還支持簡單的容錯和利用算法進行負載均衡;
在性能上,佔用很少的資源,能支持更多的併發連接,達到更高的訪問效率;
在功能上,nginx是優秀的代理服務器和負載均衡服務器;
安裝配置上,nginx安裝簡單、配置靈活;
性能方面,nginx是專門爲性能優化而開發的,非常注重效率。它採用Poll模型,可以支持更多的併發連接,最大可以支持對50000個併發連接數的形影,而且只佔用很低的內存資源;
高可用性,nginx支持熱部署,啓動速度特別迅速,可以在不間斷服務的情況下,對軟件版本或者配置進行升級,及時運行數月也無需重新啓動,幾乎可以做到7*24顯示不間斷運行
這四種軟件均爲免費開源軟件,組合到一起,成爲一個免費、高效、擴展性強的網站服務系統。
1.Nginx的安裝及基本的使用配置
nginx.org 官網
tar zxf nginx-1.4.2.tar.gz nginx-1.4.2/src/core vi nginx.h #define NGINX_VER "nginx/" NGINX_VERSION //NGINX_VERSION顯示版本,可以去掉,以防***惡意***
#nginx-1.4.2/auto/cc #vi gcc # debug #CFLAGS="$CFLAGS -g" //關閉debug調試
#./configure --prefix=/usr/local/lnmp/nginx \ --with-http_ssl_module \ --withhttp_stub_status_module //編譯,啓用https加密 和nginx 的 NginxStatus 功能, //用來監控 Nginx 的當前狀態。
#make && make install
#cd /usr/local/lnmp/nginx/sbin #ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/ //將nginx命令加入環境變量 #useradd -M -s /sbin/nologin nginx
#vim conf/nginx.conf user nginx nginx; worker_processes 2; events { use epoll; //優化nginx worker_connections 1024; } http { //打開日誌功能 log_format main '$remote_addr - $remote_user [$time_local]"$request" ' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent""$http_x_forwarded_for"'; server { location /status { stub_status on; access_log off; } } }
Nginx支持如下處理連接的方法(I/O複用方法),這些方法可以通過use
指令指定。
select - 標準方法。如果當前平臺沒有更有效的方法,它是編譯時默認的方法。你可以使用配置參數
--with-select_module
和--without-select_module
來啓用或禁用這個模塊。poll - 標準方法。如果當前平臺沒有更有效的方法,它是編譯時默認的方法。你可以使用配置參數
--with-poll_module
和--without-poll_module
來啓用或禁用這個模塊。kqueue - 高效的方法,使用於FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和MacOS X. 使用雙處理器的MacOSX系統使用kqueue可能會造成內核崩潰。
epoll - 高效的方法,使用於Linux內核2.6版本及以後的系統。在某些發行版本中,如SuSE8.2, 有讓2.4版本的內核支持epoll的補丁。
nginx -t //檢測語法
nginx //啓動nginx
nginx -s reload //重新加載nginx
nginx -s stop //關閉nginx
nginx實現虛擬主機
vi nginx.conf http { server { listen 80; server_name www.tjf.com; location / { root /html/tjf; index index.html index.htm; } } server { listen 80; server_name www.ty.com; location / { root /html/ty; index index.html index.htm; } } }
[root@node5 conf]# mkdir /html [root@node5 conf]# mkdir /html/tjf [root@node5 conf]# mkdir /html/ty [root@node5 conf]# echo "tjf" >/html/tjf/index.html [root@node5 conf]# echo "ty" >/html/ty/index.html [root@node5 conf]# nginx -s reload
在/etc/hosts中加入解析,瀏覽器訪問域名就可以實現虛擬主機
nginx負載均衡:
#vi nginx.conf upstream ty { //ty只是一個名字,可以隨便 server 192.168.0.25:8080 weight=3; //weight設置該服務器每次被訪問的次數 server 192.168.0.26:8080; } //加在http{}中
想讓那個server實現負載均衡,就修改其server{}內的語句
server { listen 80; server_name www.ty.org; # access_log logs/ty.org.access.log main; location / { proxy_pass http://ty; } }
nginx的session保持:
使用nginx sticky模塊實現基於cookie的負載均衡
即一個ip一次始終就訪問一個tomcat服務器,(當用戶註冊賬戶時,第一個註冊頁註冊完成,執行下一步時即切換頁面,不會切到另一臺tomcat服務器),另外一個ip訪問下一臺tomcat服務器
#nginx -s stop //給nginx添加模塊徐重新編譯,先stop #tar zxf nginx-sticky-module-1.1.tar.gz #cd nginx-1.4.2 #make clean
#./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module--with-http_stub_status_module--add-module=/root/nginx-sticky-module-1.1 #make && make install
#vim /usr/local/lnmp/nginx/conf/nginx.conf //配置文件中加入sticky模塊 upstream ty { sticky; server 192.168.1.25:8080; server 192.168.1.26:8080; }
#nginx //啓動nginx,就可以發現一個ip每次在有效時間內始終訪問一臺tomcat服務器
https 加密web訪問
cd /etc/pki/tls/certs make cert.pem //密鑰和密文均在此文件 cp cert.pem /usr/local/lnmp/nginx/conf
vim nginx.conf //將HTTPSserver段打開,即去掉# ssl_certificate cert.pem; ssl_certificate_key cert.pem;
nginx -t
nginx -s reload
訪問瀏覽器
獲取證書
2.Mysql的源碼安裝
mysql-5.5.12.tar.gz
#yum install cmake make gcc gcc-c++
#tar zxf mysql-5.5.12.tar.gz
#cd mysql-5.5.
#cmake-DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql \ #安裝目錄 >-DMYSQL_DATADIR=/usr/local/lnmp/mysql/data \ #數據庫存放目錄 >-DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock \ #Unixsocket 文件路徑 >-DWITH_MYISAM_STORAGE_ENGINE=1 \ #安裝 myisam 存儲引擎 >-DDEFAULT_CHARSET=utf8 \ #使用utf8 字符 >-DDEFAULT_COLLATION=utf8_general_ci \ #校驗字符 >-DEXTRA_CHARSETS=all #安裝所有擴展字符集
出現此問題根據提示知道需要安裝yuminstall ncurses-devel,安裝完後刪除緩存文件CMakeCache.txt,重新執行編譯
make && make install useradd -M -s /sbin/nologin mysql cd /usr/local/lnmp/mysql cd scripts/
./mysql_install_db --user=mysql--basedir=/usr/local/lnmp/mysql/--datadir=/usr/local/lnmp/mysql/data/ //可以使用./mysql_install_db--help查看參數信息
chown -R root.mysql/usr/local/lnmp/mysql/* chown -R mysql data/
cp support-files/my-medium.cnf/etc/my.cnf //配置文件 cp mysql.server /etc/init.d/mysqld //啓動腳本 service mysqld start
#vi /root/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin
// //現在直接使用mysql等命令,可能無法執行,需要配置環境變量,查找源碼編譯後的mysql命令路徑爲/usr/local/lnmp/mysql/bin,將其加入該文件PATH後,以分號相隔,即
#source .bash_profile //使其生效
3.php的源碼安裝
gd是一個用以生成圖片的庫
libiconv用於實現一個字符編碼到另一個字符編碼的轉換
mhash是一個哈稀演函數庫,它可以支持多種哈稀演算法,如MD5、SHA1
libmcrypt可以使php支持更多加密算法
tar zxf libiconv-1.13.1.tar.gz #加強系統對支持字符編碼轉換的功能 cd libiconv-1.13.1 ./configure--prefix=/usr/local/lnmp/modules/libiconv make && make install
tar jxf libmcrypt-2.5.8.tar.bz2 # mcrypt mhash 是 php 加密算法擴展庫 cd libmcrypt-2.5.8 ./configure--prefix=/usr/local/lnmp/modules/libmcrypt make && make install
cd libltdl/ ./configure --prefix=/usr/local/lnmp/modules/libmcrypt/libltdl --enable-ltdl-install make && make install
tar jxf mhash-0.9.9.9.tar.bz2 cd mhash-0.9.9.9 ./configure--prefix=/usr/local/lnmp/modules/mhash make && make install
tar zxf mcrypt-2.6.8.tar.gz cd mcrypt-2.6.8 ./configure--prefix=/user/local/lnmp/modules/mcrypt --with-libmcrypt-prefix=/user/local/lnmp/modules/libmcrypt
此處會報錯如上,需要如下操作:
#vi /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/local/lnmp/modules/libmcrypt/lib #ldconfig
重新編譯會報mhash錯誤,如下
需操作
vi /etc/ld.so.conf 添加如下一條 /usr/local/lnmp/modules/mhash/lib ln -s/usr/local/lnmp/modules/mhash/lib/* /usr/local/lib ln -s/usr/local/lnmp/modules/mhash/include/* /usr/loca/include ldconfig
再重新編譯則OK
#make && make install
Php軟件包依賴性:
yum install net-snmp-devel curl-devellibxml2-devel libpng-devel libjpeg-devel freetype-
devel gmp-devel
tar jxf php-5.4.12.tar.bz2 cd php-5.4.12 ./configure--prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc \ --with-mysql=/usr/local/lnmp/mysql --with-openssl --with-snmp --with-gd \ --with-zlib --with-curl --with-libxml-dir --with-png-dir --with-jpeg-dir \ --with-freetype-dir --with-pear --with-gettext --with-gmp --enable-inline-optimization \ --enable-soap --enable-ftp \ --enable-sockets --enable-mbstring --with-mysqli=/usr/local/lnmp/mysql/bin/mysql_config \ --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx \ --with-mcrypt=/usr/local/lnmp/modules/libmcrypt --with-mhash
#make ZEND_EXTRA_LIBS='-liconv' #ZEND 加速php執行,手工指定將iconv加到php額外庫中, #一般來說這些庫的增加php可以自動完成,但是iconv需要手工操作加入
#vi /etc/ld.so.conf usr/local/lnmp/modules/libiconv/lib #ln -s/usr/local/lnmp/modules/libiconv/lib/* /usr/local/lib #ldconfig
#make install
#cd /usr/local/lnmp/php/etc
#cp php-fpm.conf.default php-fpm.conf #vi php-fpm.conf ;pid = run/php-fpm.pid //去掉前邊的註釋
#cd php-5.4.12 #cp php.ini-production /usr/local/lnmp/php/etc/php.ini #適合php生產環境下的配置文件 #vi /usr/local/php/etc/php.ini cgi.fix_pathinfo=0 #防止Nginx 文件類型錯誤解析漏洞 date.timezone = Asia/Shanghai #設置時區
#cd sapi/fpm/ #cp init.d.php-fpm /etc/init.d/fpm //fpm啓動腳本,默認端口爲9000 #chmod +x /etc/init.d/fpm #/etc/init.d/fpm start
現在就可以配置nginx訪問php測試頁如下:
vi /usr/local/lnmp/nginx/conf/nginx.conf server { location / { root html; index index.phpindex.html index.htm; //記得要添加index.php } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi.conf; } }
#cat html/index.php
<?php
phpinfo()
?>
#nginx -s reload //瀏覽器訪問ip/index.php看到php測試頁則成功
現在LNMP架構已經搭建完成,接下來在lnmp架構上搭建一個bbs網站:
軟件下載地址
http://download.comsenz.com/DiscuzX/
1. 上傳 upload目錄中的文件到服務器
2. 設置目錄屬性(windows服務器可忽略這一步)
以下這些目錄需要可讀寫權限
./config
./data 含子目錄
3. 執行安裝腳本/install/
請在瀏覽器中運行install 程序,即訪問http://您的域名/論壇目錄/install/
參照頁面提示,進行安裝,直至安裝完畢
安裝完後如下
Tomcat動態頁面:
Tomcat 服務器是一個免費的開放源代碼的動態Web 應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選
tomcat相當於jsp的解釋器,主要用於動態頁面,nignx適用於web靜態頁面
安裝tomcat必須要安裝jdk
安裝jdk-6u32-linux-x64.bin
sh jdk-6u32-linux-x64.bin
mv jdk1.6.0_32/ /usr/local/jdk //移動到指定目錄
vim /etc/profile //設置java全局變量 export JAVA_HOME=/usr/local/jdk exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib //指定java庫目錄 export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile //使其立即生效
tar zxf apache-tomcat-7.0.42.tar.gz -C/usr/local/lnmp/
cd/usr/local/lnmp/apache-tomcat-7.0.42/bin
./startup.sh //tomcat默認打開端口爲8080
瀏覽器訪問192.168.1.25:8080就可以看到tomcat網頁
每次訪問都得加上:8080,若不想加可以修改nginx.conf
location ~ \.jsp$ {
proxy_pass http://127.0.0.1:8080;
}
這樣就可以不用加:8080端口訪問192.168.1.25/index.jsp,現在jsp動態網頁是通過nginx訪問
因爲nginx現在不支持圖片功能,所以訪問時不能正常顯示圖片,此時需要在ngix.conf加入一下字段:
location ~\.(png|gif|css|jsp|js)${
root/usr/local/lnmp/tomcat/webapps/ROOT;
}
再次訪問即可出現圖片
測試頁內容Thissystem's time is <%=new java.util.Date() %>
使用nginx實現tomcat動態頁面的負載均衡
vi nginx.conf
http {
upstream ty {
server 192.168.1.25:8080; //25、26主機上都裝有tomcat
server 192.168.1.26:8080;
}
}
server {
location ~ \.jsp$ {
proxy_pass http://ty;
}
}
配置好各服務器的jsp動態網頁文件
nginx -s reload
現在就可以訪問實現負載均衡了
-----------------------------------------------------------
Memcached
是一個高性能的分佈式的內存對象緩存系統,通過在內存裏維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然後從內存中讀取,從而大大提高讀取速度。
memcache爲php的一個模塊,使php能夠使用內存存儲,加載到內存提高訪問速度
enterprise6的Package裏提夠memcached
RPM 包安裝
yum install memcached
/etc/init.d/memcached start
telnet localhost 11211 //測試memcached是否成功打開
stats 查看狀態
set 設置
add 添加
get 查看delete 刪除
tomcat負載均衡的session控制
(正在訪問的服務器宕機,直接切換至另臺server,上次訪問的記錄仍可用)
session:
Tomcat-1 (T1) 將session 存儲在 memcached-2(T2)上。只有當 M2 不可用時,T1纔將 session 存
儲在memcached-1 上(M1 是T1 failoverNode)。使用這種配置的好處是,當T1 和 M1 同時崩
潰時也不會丟失session 會話,避免單點故障。
官網http://code.google.com/p/memcached-session-manager
首先A、B已經爲tomcat負載均衡:
A:
1、
asm-3.2.jar minlog-1.2.jar
kryo-1.04.jar msm-kryo-serializer-1.6.5.jar
kryo-serializers-0.10.jar reflectasm-1.01.jar
memcached-session-manager-1.6.3.jar spymemcached-2.7.3.jar
memcached-session-manager-tc7-1.6.3.jar //tc7對應tomcat的版本7
//將.jar包放至tomcat/lib目錄,一定注意包的版本
2、
vim/tomcat/conf/context.xml <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.1.25:11211,n2:192.168.1.26:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
3、
cd /tomcat/webapps/ROOT vi test.jsp //創建測試頁 <%@ page contentType="text/html;charset=GBK" %> <%@ page import="java.util.*"%> <html><head><title>ClusterApp Test</title></head> <body> Server Info: <% out.println(request.getLocalAddr() +" : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID "+ session.getId()+"<br>"); String dataName =request.getParameter("dataName"); if (dataName != null &&dataName.length() > 0) { String dataValue =request.getParameter("dataValue"); session.setAttribute(dataName,dataValue); } out.print("<b>Sessionlist</b>"); Enumeration e =session.getAttributeNames(); while (e.hasMoreElements()) { String name =(String)e.nextElement(); String value =session.getAttribute(name).toString(); out.println( name + " = "+ value+"<br>"); System.out.println( name + " =" + value); } %> <form action="test.jsp"method="POST"> name:<input type=text size=20name="dataName"> <br> key:<input type=text size=20name="dataValue"> <br> <input type=submit> </form> </body> </html>
4、
/etc/init.d/memcached start /tomcat/bin/./shutdown.sh /tomcat/bin/./startup.sh //重啓tomcat
tail -f /tomcat/logs/catalina.out //查看日誌,如初始化finished,則成功 INFO: MemcachedSessionServicefinished initialization……
B:中1、3、4步驟一樣,2配置的內容稍微有改變
<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.1.25:11211,n2:192.168.1.26:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />