在介紹如何搭建一個web生產環境的以前,咱們先了解一下,如何選擇系統和相關軟件,還有一個web生產環境須要知足哪些要求,只要把這些內容瞭解清楚,那麼再搭建過程當中就會找到你本身的思路,而不是一成不變。javascript
一:系統的選擇php
適合作web生產環境的服務器系統版本有不少,咱們要怎樣從這些系統中選出適合本身的的一種呢?那麼就要知足如下幾個條件:css
web應用的語言環境,若是你手中的web應用端是.net,那麼直接選擇win的系統,若是web應用端是php或者jsp,那麼就要從如下幾點繼續考慮了。html
對系統的認真程度,做爲中小型企業或者我的用戶在選擇服務器系統時,通常都是兩個選擇,一種是咱們最經常使用的windows,一種是用戶逐步上漲的linux,那麼再選擇屬於咱們本身的系統時,就要考慮咱們對系統的瞭解了。不少人選擇linux,問他爲何。他說,linux更安全,不會中病毒,不會中***,不死機。windows病毒***太多了,太容易受到惡意***了。在這裏我能夠說這種盲目的選擇是錯誤的。任何系統都有破綻,都會中病毒,或者受到惡意***。java
對成本的要求,windows與linux最大的區別就是一個是不開源的項目,一個是開源項目,很簡單。node
windows有成熟的系統服務支持,價格昂貴,那有人說了,我把server破解了,同樣用啊,也不收費,我本身維護。那我想有這樣想法的童鞋,有一大部分都選擇了linux,由於linux屬於開源的項目,有不少精英團隊在共同開發linux,不少服務都有開源提供下載,網上相關資料也不少,這就爲咱們在系統和服務支持上面節省了大量的資金。mysql
從上面我本身囉哩囉嗦總結的這三點,我選擇是的linux -centos操做系統,就很少說了,繼續往下走。linux
二:web服務器的選擇nginx
咱們linux下面經常使用的web服務器有apache nginx tomcat resin 等等web服務器,這裏咱們選擇nginx+tomcat的組合 來搭建咱們的生產環境。c++
緣由這裏簡單的說幾點: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生產環境的搭建也介紹完了,真正的系統生產環境不是靠幾篇文章,靠安裝幾個軟件就能搞定的,須要技術人員經過在應用中不段的積累豐富本身的經驗,這樣才能搭建出更好的系統環境,俗話說是騾子是馬拉出來溜溜,本身也動手試試吧。