LNMP的架構及應用(如論壇搭建,memcached、tomcat的整合等)

LNMP架構及應用


LNMP代表的就是:Linux系統下Nginx+MySQL+PHP這種網站服務器架構。

Linux是一類Unix計算機操作系統的統稱,是目前最流行的免費操作系統。

Nginx是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理服務器。

   有以下優勢:

       作爲web服務器,nginx處理靜態文件、索引文件,自動索引的效率非常高;

       作爲代理服務器,nginx可以實現無緩存的反向代理加速,提高網站的運行速度;

       作爲負載均衡服務器,nginx既可以在內部直接支持Rails和PHP,也可以支持HTTP代理服務器對外進行服務,同時還支持簡單的容錯和利用算法進行負載均衡;

       在性能上,佔用很少的資源,能支持更多的併發連接,達到更高的訪問效率;

       在功能上,nginx是優秀的代理服務器和負載均衡服務器;

       安裝配置上,nginx安裝簡單、配置靈活;

       性能方面,nginx是專門爲性能優化而開發的,非常注重效率。它採用Poll模型,可以支持更多的併發連接,最大可以支持對50000個併發連接數的形影,而且只佔用很低的內存資源;

       高可用性,nginx支持熱部署,啓動速度特別迅速,可以在不間斷服務的情況下,對軟件版本或者配置進行升級,及時運行數月也無需重新啓動,幾乎可以做到7*24顯示不間斷運行

Mysql是一個小型關係型數據庫管理系統
PHP是一種在服務器端執行的嵌入HTML文檔的腳本語言

這四種軟件均爲免費開源軟件,組合到一起,成爲一個免費、高效、擴展性強的網站服務系統。


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;
         }
 }


nginxsession保持:

使用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


訪問瀏覽器

wKiom1NftpTgdZmtAAJcGzPOPUY613.jpg

獲取證書


wKiom1NftqXiiWasAACpDUr8pmk556.jpg

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                                        #安裝所有擴展字符集

wKioL1NfuC3D3SDUAAGKJ1lmLNs537.jpg


出現此問題根據提示知道需要安裝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



wKioL1NfuqCw0-GlAAHuzkl0XGs363.jpg


此處會報錯如上,需要如下操作:

#vi /etc/ld.so.conf
    include ld.so.conf.d/*.conf
    /usr/local/lnmp/modules/libmcrypt/lib
#ldconfig


重新編譯會報mhash錯誤,如下

wKiom1Nfux6x8TYrAACLSi8qzLk849.jpg



需操作

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


wKiom1NfvNzzmS0WAABqpv-IFS4104.jpg


#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測試頁則成功

wKioL1NfvQDgTRjwAAKmacpR090044.jpg

現在LNMP架構已經搭建完成,接下來lnmp架構上搭建一個bbs網站

軟件下載地址

http://download.comsenz.com/DiscuzX/


1. 上傳 upload目錄中的文件到服務器

2. 設置目錄屬性(windows服務器可忽略這一步)

以下這些目錄需要可讀寫權限

       ./config

       ./data 含子目錄

3. 執行安裝腳本/install/

請在瀏覽器中運行install 程序,即訪問http://您的域名/論壇目錄/install/

  1. 參照頁面提示,進行安裝,直至安裝完畢


安裝完後如下

wKiom1NfvZ2hxr-tAAI7XdGMaUU454.jpg



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.258080就可以看到tomcat網頁

wKioL1NfvkKDP3QAAAL4qIT2K-w672.jpg



每次訪問都得加上:8080,若不想加可以修改nginx.conf

  location ~ \.jsp$ {

           proxy_pass  http://127.0.0.1:8080;

       }

這樣就可以不用加:8080端口訪問192.168.1.25/index.jsp,現在jsp動態網頁是通過nginx訪問

wKiom1NfvqTxLZOaAAIslUY7r9k365.jpg


因爲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;                                //2526主機上都裝有tomcat

       server 192.168.1.26:8080;

   }

}

server {

location ~ \.jsp$ {

           proxy_pass   http://ty;

       }

}


配置好各服務器的jsp動態網頁文件

nginx -s reload

現在就可以訪問實現負載均衡了



-----------------------------------------------------------


Memcached

是一個高性能的分佈式的內存對象緩存系統,通過在內存裏維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然後從內存中讀取,從而大大提高讀取速度。

memcache爲php的一個模塊,使php能夠使用內存存儲,加載到內存提高訪問速度


enterprise6Package裏提夠memcached

RPM 包安裝

yum install memcached

/etc/init.d/memcached start

wKioL1Nfvsbi0Qu3AACdqFdZAwY093.jpg

wKiom1NfvvCRxMhwAACQlQ5VjC4637.jpg


telnet localhost 11211         //測試memcached是否成功打開

 stats 查看狀態

 set 設置

 add 添加

 get 查看delete 刪除

wKioL1NfvwSAKOE2AACMKUbUHlE295.jpg


tomcat負載均衡的session控制

(正在訪問的服務器宕機,直接切換至另臺server,上次訪問的記錄仍可用)


session:  

wKioL1Nfv56yC8O4AAAZLrygU7Y333.jpg交叉存儲memcache


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


首先AB已經爲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:中134步驟一樣,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"
                    />



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章