天天看點

搭建符合自己實際需求的web生産環境之java篇

       在介紹如何搭建一個web生産環境的之前,我們先了解一下,如何選擇系統和相關軟體,還有一個web生産環境需要滿足哪些要求,隻要把這些内容了解清楚,那麼再搭建過程中就會找到你自己的思路,而不是一成不變。

一:系統的選擇

       适合做web生産環境的伺服器系統版本有很多,我們要怎樣從這些系統中選出适合自己的的一種呢?那麼就要滿足以下幾個條件:

  1. web應用的語言環境,如果你手中的web應用端是.net,那麼直接選擇win的系統,如果web應用端是php或者jsp,那麼就要從以下幾點繼續考慮了。
  2. 對系統的認真程度,作為中小型企業或者個人使用者在選擇伺服器系統時,一般都是兩個選擇,一種是我們最常用的windows,一種是使用者逐漸上漲的linux,那麼再選擇屬于我們自己的系統時,就要考慮我們對系統的了解了。很多人選擇linux,問他為什麼。他說,linux更安全,不會中病毒,不會中木馬,不當機。windows病毒木馬太多了,太容易受到惡意攻擊了。在這裡我可以說這種盲目的選擇是錯誤的。任何系統都有破綻,都會中病毒,或者受到惡意攻擊。
  3. 對成本的要求,windows與linux最大的差別就是一個是不開源的項目,一個是開源項目,很簡單。

    windows有成熟的系統服務支援,價格昂貴,那有人說了,我把server破解了,一樣用啊,也不收費,我自己維護。那我想有這樣想法的童鞋,有一大部分都選擇了linux,因為linux屬于開源的項目,有很多精英團隊在共同開發linux,很多服務都有開源提供下載下傳,網上相關資料也很多,這就為我們在系統和服務支援上面節省了大量的資金。

    從上面我自己啰哩啰嗦總結的這三點,我選擇是的linux -centos作業系統,就不多說了,繼續往下走。

二:web伺服器的選擇

  我們linux下面常用的web伺服器有apache nginx tomcat resin  等等web伺服器,這裡我們選擇nginx+tomcat的組合 來搭建我們的生産環境。

  原因這裡簡單的說幾點:nginx處理速度要快于apache占用記憶體資源也少,這點毋庸置疑。

                        nginx所有的子產品都是靜态編譯的,而且對fcgi有非常好的支援。

                        nginx支援epoll模式,而apache卻不支援。

  nginx作為web伺服器的優勢顯而易見,但是他不支援動态處理,因為我們這裡的環境是java,是以接下來選擇與nginx的組合是老牌的tomcat,tomcat是大家普遍公認的java處理伺服器,雖然它也支援靜态處理,但是效果也比nginx差很遠。是以我們采用組合,讓他們的強項結核在一起,更好的發揮web伺服器的性能。

三:上面介紹了軟體方面,接下來說硬體選擇。

   如果有條件,在資金允許的情況下,品牌伺服器是首選,我也隻購買過dell的R720伺服器,不多做評論,隻說下我選擇dell伺服器的理由:

  1. 在IBM HP DELL之間 同等配置 DELL屬于價格最便宜的。
  2. DELL伺服器可以根據自己實際需求來選擇硬體。
  3. 我們這邊的DELL的售後我接觸過,比較放心。

基于上面幾點簡單的有力,我選擇了DELLR720機架伺服器

那麼再選擇CPU 記憶體 raid卡 等硬體上需要怎麼選擇呢?

  1. CPU對mysql資料庫的起至關重要的作用,核心多少,性能高低,決定了資料庫查詢快慢
  2. 記憶體這裡建議選擇大記憶體,記憶體還是比較便宜的16G或者32G都要普及了。
  3. 硬碟選擇,這裡我建議選擇4塊15000轉的硬碟,具體每塊磁盤空間大小根據實際需求決定,這麼選擇的好處是,RAID 可選×××多,可以選擇RAID10或者選擇RAID5,而且也處于災備考慮,若是在RAID5情況下 壞掉了一塊硬碟,那麼就拔掉一塊,一時半會來不及換新硬碟也不會影響到我們伺服器的正常運作。
  4. 陣列卡的選擇,若是選擇硬陣列卡的話就有緩存問題,再有對存儲讀取方面有需求的話,可以選擇緩存較大的。
  5. 電源選擇我覺得為了安全起見就選2塊,一塊電源就幾百塊錢,買個放心。

   其他的也不多說了。有了硬體上的支援,最後一個選擇就是帶寬線路的支援了。有的投入是該省的省,但有的則是該花的花啊。

   如果你的站點很火爆,人氣很旺,增長量很快,充足的帶寬是多麼重要啊,可不要成為大炮打蚊子,有了好伺服器發揮不好出效果。

好了,選來選去的,也選完了,接下來就是安裝配置伺服器的環節了,下面也會圖文并茂的介紹一下整個過程.

四:搭建web生産環境

   系統環境:最小化安裝centos6.3_64

   jdk版本:jdk1.6,選擇和開發時一樣的版本

   nginx版本:nginx.1.2.5.tar.gz

   tomcat版本:tomcat7

   mysql版本:mysql.5.5.11.tar.gz

   如果伺服器之前有硬防火牆的話,可以關閉linux系統自帶的iptables和selinux

   最後也會簡單介紹一下。

在安裝這些軟體之前,我們通過yum 來安裝一些必要的工具,這裡就不多解釋了,不裝的話,後面安裝軟體就會報錯。

yum install gcc gcc-c++ make cmake wget libtool perl-devel ncurses-devel libxml2-devel
zlib-devel      

1.    安裝jdk

tar -xvf jdk1.6.tar.gz
mv jdk1.6.tar.gz /usr/local/jdk
接下來加入環境變量
vi /etc/profile
在最後添加上:
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
儲存退出:
source /etc/profile  重新整理一下系統變量,這樣可以不用重新開機伺服器
java -version 檢視一下 jdk版本      
搭建符合自己實際需求的web生産環境之java篇

2.    安裝tomcat

tar -xvf tomcat.6.0.36.tar.gz
mv apache-tomcat-6.0.36 /usr/local/tomcat
啟動tomcat:
/usr/local/tomcat/bin/startup.sh      
搭建符合自己實際需求的web生産環境之java篇

   tomcat這就安裝完成了,測試一下,在位址欄輸入http://ip位址:8080

搭建符合自己實際需求的web生産環境之java篇

   出現這個頁面代表安裝和啟動沒有任何問題

   tomcat的配置檔案在是/usr/local/tomcat/conf/server.xml 因為這裡不需要修改,是以就不多介紹了,網上相關資料也很多,多利用搜尋引擎,查資料,很有幫助。

3.    安裝Nginx

3.1 安裝Nginx所需要的pcre-devel庫

tar -xvf pcre-8.02.tar.gz
cd pcre-8.02
make && make install
cd /lib64
ln -s libpcre.so.0.0.1 libpcre.so.1      

   如果不做這個連結的話 啟動nginx會報錯 就是找不到這個libpcre.so.1

3.2 安裝Nginx-1.2.5

tar -xvf nginx-1.2.5.tar.gz
cd nginx-1.2.5
./configure --prefix=/usr/local/nginx \  指定nginx的安裝目錄
--with-http_stub_status_module \  啟用nginx的status功能,可以監控nginx目前狀态
--with-http_gzip_static_module \  支援線上實時壓縮輸出資料流
--with-google_perftools_module \  支援TCMalloc對Nginx性能的優化
make && make install      

   這裡安裝了TCMalloc子產品來對Nginx優化 是以要先安裝這個開源工具,請看:

   http://yanzhe.blog.51cto.com/blog/5279577/1182055

   安裝完成後,再回頭來編譯。

3.3 配置Nginx 詳細介紹

   修改Nginx安裝目錄的conf/nginx.conf 檔案

vi /usr/local/nginx/conf/nginx.conf      

3.31 Nginx的全局配置

user nobody nobody; 指定了Nginx Worker程序運作使用者及使用者組,此處是預設值
worker_processes 4;  指定了Nginx開啟的程序數,如果多核CPU,就設定與CPU的核心數量一樣多
error_log logs/error.log notice; 定義了全局錯誤日志 級别為notice
pid    logs/nginx.pid; 指定了nginx程序id存儲檔案的位置
worker_rlimit_nofile 65535;  用于綁定worker程序和CPU
events{   用來設定Nginx的工作模式以及連接配接數上限
use epoll;  Nginx的工作模式,對于linux系統 epoll模式為首選
worker_connections 60000; 每個程序的最大連接配接數  下面公式:
}      

   max_clients=processes*connections

   最大連接配接數=程序數*每個程序最大連接配接數

   在作為反向代理時  還要除以4

   程序的最大連接配接數受linux系統程序的最大打開檔案數限制,修改方法:  

vi /etc/security/limits.conf      

   修改以下内容:

搭建符合自己實際需求的web生産環境之java篇

   worker_connections的設定才能生效。

3.32 Nginx對HTTP伺服器相關屬性配置

http{
include conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
client_max_body_size  20m;
client_header_buffer_size 32k;
large_client_header_buffers  4 64k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout  10;
}      

   下面詳細介一下以上配置的意思:

   include    将外部的檔案引入,減少主配置檔案的複雜度

   default_type  預設類型為二進制流

   log_format   指定了Nginx日志的輸出格式

   client_max_body_size 允許用戶端請求的最大的單個檔案位元組數

   client_header_buffer_size 用戶端請求頭headerbuffer大小

   large_client_header_buffers 用戶端請求中較大的消息頭的 個數 與 大小

   sendfile 開啟了高效檔案傳輸模式

   tcp_nopush 設定為on 防止網絡阻塞

   tcp_nodelay 設定為on 防止網絡阻塞

   keepalive_timeout 用戶端連接配接保持活動的逾時時間 逾時後伺服器關閉連接配接

   client_header_timeout 用戶端請求頭逾時時間 逾時後Nginx傳回Request time out(408)錯誤

   client_body_timeout 用戶端請求主體逾時時間 逾時後Nginx傳回Request time out(408)錯誤

   send_timeout 兩個連接配接活動之間的時間,如果超過這個時間用戶端沒任何活動,Nginx将會關閉連接配接

3.33 HTTP GZIP子產品配置

gzip on;
gzip_min_length 1k;
gzip_buffers  4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types  text/plain application/x-javascript text/css application/xml;
gzip_very on;      

   下面詳細介紹一下以上配置的意思:

   gzip  設定開啟gzip壓縮,實時壓縮輸出資料流

   gzip_min_length  允許壓縮的頁面最小值,頁面位元組數從header頭的Content-Length中擷取

   建議設定成大于1K的位元組數,小于1K可能會越壓縮越大

   gzip_buffers 申請 4個 機關 為16k的記憶體作為壓縮結果流緩存

   gzip_http_version 設定識别HTTP協定版本 預設1.1  幾乎所有浏覽器都支援gzip壓縮

   gzip_comp_level 指定gzip的壓縮比例 數值越小 壓縮比越小 處理速度也快,反之越慢 也消耗CPU

   gzip_types  用來指定壓縮的類型

   gzip_vary 開啟前段的緩存伺服器緩存經過gzip壓縮的頁面

3.34 負載均衡配置

upstream tomcats{
ip_hash;
server 192.168.1.200:8080;
server 192.168.1.201:8080 down;
server 192.168.1.202:8080 max_fails=3 fail_timeout=20s;
}      

   Nginx的負載均衡子產品目前支援4種排程算法,其中 後兩項屬于第三方排程算法

   輪詢(預設) 每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端有當機,系統将自動剔除,不影響

   Weight 指定輪詢的權值,Weight值越大 配置設定到的通路幾率越高,應用于後端伺服器性能不均的情況

   ip_hash    來自同一個IP的訪客将固定通路一個伺服器,解決了動态網頁存在session的問題

   fair   根據頁面大小和加載時間長短進行負載均衡,Nginx本身不支援fair,需要下載下傳upstream_fair子產品

   url_hash  每個URL定向到同一個伺服器,可以進一步提高緩存伺服器的效率 也必須安裝Nginx的hash軟體包

   負載均衡排程中的狀态:

   down,表示目前的server暫時不參與負載均衡

   backup,預留備份機器,其他所有的非backup機器出現故障或者繁忙的時候,才會請求backup機器

   max_fails 允許請求失敗的次數   超過最大次數,傳回proxy_next_upstream

   fail_timeout 經理了max_fails次數失敗後,暫停服務的時間  兩個狀态可以一起用

   注意:在ip_hash排程時,負載均衡排程狀态不能是weight 和backup

3.35 server虛拟主機的配置

server{
listen 8080;  端口根據自己後端伺服器情況而定
server_name 192.168.1.200  www.abc.com;  可以是IP  也可以通過域名
index  index.html  index.htm  index.jsp;   設定通路預設首頁的位址
root /www/abc 虛拟機的網頁根目錄
charset gb2312; 用于設定網頁的編碼格式
access_log logs/abc.access.log main;   通路日志存放路徑  用main指定輸出格式
}      

3.36 URL 比對的詳細配置

   location 支援正規表達式,也支援條件判斷,使用者可以通過location實作動靜态分離

   所有靜态檔案(html jpg)等都留下來自己處理  所有jsp動态檔案交予tomcat處理

   所有擴充名為.gif、.jpg、.png、,swf的靜态檔案都交給Nginx處理

location ~ .*\.(gif|jpg|png|swf)$ {
root /web/abc;  網站根目錄
expires 30d;    指定靜态檔案的過期時間 這裡是30天
}      

   将網站根目錄下的 upload目錄 和 html目錄 下的所有檔案都交給nginx處理

location ~ ^/(upload|html)/ {
root /web/abc;  網站根目錄
expires 30d;    指定靜态檔案的過期時間 這裡是30天
}      

   将虛拟主機下的所有.jsp字尾名的檔案都交給本機的8080端口處理

location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}      

3.37 錯誤資訊傳回頁面配置

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location =  /50x.html {
root html;  指定 傳回錯誤後 從哪找錯誤頁面
}      

   根據上面對nginx配置檔案詳細的介紹,相信能掌握如何配置nginx 負載均衡 動靜态分離 等web伺服器相關的技術資訊。根據自己的實際情況,将靜态的檔案交給nginx處理,将動态的檔案交給tomcat處理,負載大了,也可以使用nginx來進行負載均衡,也可以通過多個tomcat啟動來負載均衡,相關資料:http://yanzhe.blog.51cto.com/5279577/1177091

   配置完成Nginx後,可以通過/usr/local/nginx/sbin/nginx -t 來檢驗配置有沒有錯誤。有錯誤的地方,會告訴你錯誤位置,如果沒有錯誤,則會出現下圖所示:

搭建符合自己實際需求的web生産環境之java篇

   Nginx的啟動和關閉

/usr/local/nginx/sbin/nginx  這樣就啟動了Nginx
ps -ef |grep nginx  如圖:      
搭建符合自己實際需求的web生産環境之java篇
kill 7665  這樣就關閉了nginx      

   到此nginx的詳細介紹就介紹完了,繼續下面的mysql安裝

4.    安裝mysql資料庫

4.1建立mysql安裝目錄

mkdir -p /usr/local/webserver/mysql/      

4.2建立資料存放目錄

mkdir -p /data/mysql/      

4.3建立使用者和使用者組與賦予資料存放目錄權限

groupadd mysql
useradd -g mysql mysql
chown mysql.mysql -R /data/mysql/      

4.4下載下傳解壓mysql 5.5.11

wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.11.tar.gz
tar zxvf mysql-5.5.11.tar.gz
cd mysql-5.5.11      

4.5編譯mysql-5.5.11

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/  \
-DMYSQL_DATADIR=/data/mysql  \
-DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock  \
-DWITH_INNOBASE_STORAGE_ENGINE=1  \
-DENABLED_LOCAL_INFILE=1 \-DMYSQL_TCP_PORT=3306  \
-DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci  \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock  \
-DMYSQL_USER=mysql \-DWITH_DEBUG=0
make && make install      

4.6複制配置檔案

cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld      

4.7初始化資料庫

cd /usr/local/mysql/scripts
./mysql_install_db --user=mysql \
--basedir=/usr/local/webserver/mysql \
--datadir=/data/mysql/ &      

4.8啟動mysql服務

/etc/init.d/mysqld start
ps -ef |grep mysql 指令檢視是否啟動      

4.9登入mysql資料庫

/usr/local/webserver/mysql/bin/mysql -u root -p      

   通過指令行登入管理MySQL伺服器 初始密碼為空

4.10去掉匿名登入

delete from mysql.user where user="";      

4.11如果有需要遠端連接配接mysql的話如下操作:

use mysql ;
insert into user set host='%',user='root',password='';      

4.12給本地和遠端主機使用者設定密碼

use mysql ;
set password for 'root'@'localhost'=PASSWORD("123456");
set password for 'root'@'%'=PASSWORD("123456");
FLUSH PRIVILEGES;      

5. 下面給出的是在linux系統中對Nginx應用而進行的系統核心參數的優化。

net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30      

   将上面的核心參數值 加入到/etc/sysctl.conf檔案中,然後執行如下指令使之生效  

mkdir -p /usr/local/webserver/mysql/      

   下面對上面的參數進行介紹一下:

   net.ipv4.tcp_max_tw_buckets 用來設定timewait的數量 預設是180000,這裡改為6000

   net.ipv4.ip_local_port_range 用來設定允許系統打開的端口範圍最小值1024

   net.ipv4.tcp_tw_recycle 用來設定啟動timewait快速回收。

   net.ipv4.tcp_tw_reuse 用來設定開啟重用,允許将time-wait sockets重新用于新的tcp連接配接

   net.ipv4.tcp_syncookies 用來開啟syn cookies,當出現syn等待隊列一處時,啟用cookies處理

   net.core.somaxconn 預設是128,參數用于調節系統同時發起的tcp連接配接數,在高并發的請求中,預設的值可能會導緻連接配接逾時或者重傳,是以,需要結合并發請求數來調節此值。

   net.core.netdev_max_backlog 表示當每個網絡接口接受資料包的速率比核心處理這些包的速率快時,允許發送到隊列的資料包的最大數目。

   net.ipv4.tcp_max_orphans  用于設定系統中最多有多少個tcp套接字不被關聯到任何一個使用者檔案句柄上。如果超過這個數字,孤立連接配接将立即被複位并列印出警告資訊。這個限制值是為了防止簡單的DOS攻擊。不能過分依靠這個限制甚至人為減小這個值,更多的情況下應該增加這個值。

   net.ipv4.tcp_max_syn_backlog 用于記錄那些尚未收到用戶端确認資訊的連接配接請求的最大值。對于有128MB記憶體的系統而言,次參數預設值是1024,對小記憶體的系統則是128

   net.ipv4.tcp_synack_retries 參數的值決定了核心放棄連接配接之前發送SYN+ACK包的數量

   net.ipv4.tcp_syn_retries 表示在核心放棄履歷連接配接之前發送SYN包的數量

   net.ipv4.tcp_fin_timeout 決定了套接字保持在FIN-WAIT-2 狀态的時間。預設值是60秒。正确設定這個值非常重要,有時即使一個負載很小的web伺服器,也會出現大量的死套接字而産生記憶體溢出的風險。