在介紹如何搭建一個web生產環境的之前,我們先了解一下,如何選擇系統和相關軟件,還有一個web生產環境需要滿足哪些要求,只要把這些內容瞭解清楚,那麼再搭建過程中就會找到你自己的思路,而不是一成不變。
一:系統的選擇
適合做web生產環境的服務器系統版本有很多,我們要怎樣從這些系統中選出適合自己的的一種呢?那麼就要滿足以下幾個條件:
web應用的語言環境,如果你手中的web應用端是.net,那麼直接選擇win的系統,如果web應用端是php或者jsp,那麼就要從以下幾點繼續考慮了。
對系統的認真程度,作爲中小型企業或者個人用戶在選擇服務器系統時,一般都是兩個選擇,一種是我們最常用的windows,一種是用戶逐步上漲的linux,那麼再選擇屬於我們自己的系統時,就要考慮我們對系統的瞭解了。很多人選擇linux,問他爲什麼。他說,linux更安全,不會中病毒,不會中***,不死機。windows病毒***太多了,太容易受到惡意***了。在這裏我可以說這種盲目的選擇是錯誤的。任何系統都有破綻,都會中病毒,或者受到惡意***。
對成本的要求,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服務器的理由:
在IBM HP DELL之間 同等配置 DELL屬於價格最便宜的。
DELL服務器可以根據自己實際需求來選擇硬件。
我們這邊的DELL的售後我接觸過,比較放心。
基於上面幾點簡單的有力,我選擇了DELLR720機架服務器
那麼再選擇CPU 內存 raid卡 等硬件上需要怎麼選擇呢?
CPU對mysql數據庫的起至關重要的作用,核心多少,性能高低,決定了數據庫查詢快慢
內存這裏建議選擇大內存,內存還是比較便宜的16G或者32G都要普及了。
硬盤選擇,這裏我建議選擇4塊15000轉的硬盤,具體每塊磁盤空間大小根據實際需求決定,這麼選擇的好處是,RAID 可選性交多,可以選擇RAID10或者選擇RAID5,而且也處於災備考慮,若是在RAID5情況下 壞掉了一塊硬盤,那麼就拔掉一塊,一時半會來不及換新硬盤也不會影響到我們服務器的正常運行。
陣列卡的選擇,若是選擇硬陣列卡的話就有緩存問題,再有對存儲讀取方面有需求的話,可以選擇緩存較大的。
電源選擇我覺得爲了安全起見就選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版本
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
tomcat這就安裝完成了,測試一下,在地址欄輸入http://ip地址:8080
出現這個頁面代表安裝和啓動沒有任何問題
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
修改以下內容:
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 來檢驗配置有沒有錯誤。有錯誤的地方,會告訴你錯誤位置,如果沒有錯誤,則會出現下圖所示:
Nginx的啓動和關閉
/usr/local/nginx/sbin/nginx 這樣就啓動了Nginx ps -ef |grep nginx 如圖:
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服務器,也會出現大量的死套接字而產生內存溢出的風險。
net.ipv4.tcp_keepalive_time 表示當keepalive啓動的時候,tcp發送keepalive消息的頻度。默認值是2(單位是小時)。
介紹到這裏,web生產環境的搭建也介紹完了,真正的系統生產環境不是靠幾篇文章,靠安裝幾個軟件就能搞定的,需要技術人員通過在應用中不段的積累豐富自己的經驗,這樣才能搭建出更好的系統環境,俗話說是騾子是馬拉出來溜溜,自己也動手試試吧。