HappyAA服務器部署筆記1(nginx+tomcat的安裝與配置)

這是本人的服務器部署筆記.文章名稱叫"部署筆記1"的緣由是以後我對這個進行了改進以後,會有"部署筆記2","部署筆記3"...按部就班,估計應該是這樣的:)html

  1. 概述與設計
  2. nginx安裝
  3. nginx基本使用
  4. nginx的配置
  5. tomcat的安裝與配置
  6. 部署程序
  7. 待續

概述與設計

主機使用阿里雲主機,配置不高,但前期應該夠用,之後有須要的話再升級.前端

主要的業務邏輯是用java實現,並用tomcat承載,但你們知道tomcat並不適合做爲大量的靜態資源的訪問的服務器,這個工做交給nginx正好,因此用nginx做爲反向代理,把業務邏輯交給tomcat,而其它一些資源訪問的工做nginx本身直接處理並返回.設計以下:java

http(s)://happyaa.com/resource/... => 靜態資源文件,nginx直接本身處理
https://happyaa.com/hpaasvc/...    => 主業務邏輯交給tomcat(使用安全鏈接)
http://happyaa.com/hpaasvc/...     => 重定向到https,對於hpaasvc,必須使用安全鏈接
http(s)://happyaa.com/...          => 其它,交給tomcat處理

你們可能已經注意到了,對於業務邏輯這一塊,我使用了安全鏈接,這個安全鏈接也是由nginx提供的,而tomcat不會直接暴露給客戶端訪問,一來nginx的併發能力比tomcat強不少,這樣有利於性能的提升,二來能夠經過配置nginx來擋掉不少非法訪問,讓tomcat更加專一於業務.後面還能夠考慮用nginx提供緩存等,總以前端服務器就是nginx無疑了.nginx

nginx安裝

個人操做系統是CentOS,在安裝nginx以前先yum update一下:
#yum update
更新一些庫和必要的支持,完了以後去下載一個nginx的最新版,現在我責編的版本是1.7.7:
#wget http://nginx.org/download/nginx-1.7.7.tar.gz
解壓縮
#tar -zvxf nginx-1.7.7.tar.gz
#cd nginx-1.7.7
nginx有不少不少編譯配置項,但因爲我這是第一篇筆記,因此我基本上都使用了默認的配置:
#./configure --with-http_ssl_module --with-http_gzip_static_module
我只加了兩個選項,--with-http_ssl_module表示使用ssl模塊,--with-http_gzip_static_module表示使用gzip模塊,其它更詳細的配置就要參考nginx的文檔了:http://nginx.org/en/docs/configure.htmlweb

若是沒configure成功(會顯示XXX not found),那是由於有些依賴沒有被正確安裝.那麼先安裝一下這些依賴條件,一般是pcre,zlib這些,這麼一下就基本上能夠了:
#yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel數據庫

#make
#make installapache

可執行文件就會被安裝在: /usr/sbin/nginx (默認配置)後端

nginx基本使用

啓動nginx:
#cd /usr/local/nginx/sbin/
#./nginxapi

若是運行的時候不帶-c參數,那就採用默認的配置文件,即/etc/nginx/nginx.conf瀏覽器

查看運行進程狀態:
# ps aux | grep nginx

打開瀏覽器,訪問http://localhost/看看nginx的默認頁面:

中止nginx:
#./nginx -s stop

重啓nginx(配置文件變更後須要重啓才能生效):
#./nginx -s reload

檢查配置文件是否正確:
#./nginx -t

查看nginx的pid:
cat /usr/local/nginx/logs/nginx.pid

查看nginx版本
$ ./nginx -v

回頭看編譯配置
# ./nginx -V

nginx的配置

nginx的功能基本上都是經過配置實現的,現在咱們只須要符合咱們前面提到的那些功能的配置便可.下面是個人ngxin配置文件,大部分都是默認的,只須要注意粗體字部分.我都在上面加了一些註釋.(限於我這個初級用戶的水平,有些可能不太準確,要詳細瞭解的話仍是獲得官網去查文檔:http://nginx.org/en/docs/,或者自行google)

#工做進程所用的用戶,我這裏用了root用戶,其實不太好,更好的作法是建立一個專門的用戶
user  root;
#工做進程數,一般主機的CPU核心數是多少,這裏就寫多少
worker_processes  2;

events {
    #最大網絡鏈接數
    worker_connections  1024;
}

http {
    include       mime.types;
    #默認的響應的MIME類型
    default_type  application/octet-stream;
    #容許使用系統的sendfile()函數,聽說這樣能提升性能,我是不太瞭解
    sendfile        on;
    #鏈接保持的時間
    keepalive_timeout  65;
    #配置普通http鏈接
    server {
        listen       80;
        server_name  happyaa.com;
        #將對 http://happyaa.com/... 的訪問轉向後端的 http://localhost:8080/...
        location / {
            #見註解1
            proxy_set_header Host $host;
 #見註解2
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://localhost:8080/;
        }
        #對http://happyaa.com/resource/... 的訪問將會返回主機上的 /resource/... 文件資源
        location /resource {
            alias /resource;
            expires 1h;
        }
        #對http://happyaa.com/hpaasvc/...的訪問將重定向至https://happyaa.com/hpaasvc/...
        location /hpaasvc {
            rewrite ^(.*)$ https://$host$1 permanent;
        }
    }
    #配置https安全鏈接
    server {
        listen       443 ssl;
        server_name  happyaa.com;
        ssl on;
        #證書文件位置: /usr/local/nginx/conf/cert/happyaa.com.crt
        ssl_certificate      cert/happyaa.com.crt;
        #密鑰文件位置: /usr/local/nginx/conf/cert/happyaa.com.key
        ssl_certificate_key  cert/happyaa.com.key;
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  10m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        #將對 https://happyaa.com/... 的訪問轉向後端的 http://localhost:8080/...
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://localhost:8080/;
        }
        #對https://happyaa.com/resource/... 的訪問將會返回主機上的 /resource/... 文件資源
        location /resource {
            alias /resource;
            expires 1h;
        }
    }
}

註解1:若是不加上"proxy_set_header Host $host;"這麼一行,那麼對http://happyaa.com/hpaasvc/的訪問,就會被Tomcat理解爲"http://localhost:8080/hpaasvc/",能夠經過這個方法檢驗:request.getRequestURL().加上這麼一句話以後,就至關於修改了http頭中的host字段,用happyaa.com取代localhost.這樣重定向的時候纔不會有問題.

註解2:X-Forwarded-For和X-Forwarded-Proto都是咱們要附加的http的頭,這些頭原本也沒有什麼特殊意義,但配合Tomcat使用以後意義就來了.好比咱們對https://happyaa.com的訪問,對於tomcat來講,就變成了http://happyaa.com,會把https轉爲http,這個不難理解,由於咱們是經過nginx這個反向代理來訪問Tomcat的,nginx和Tomcat之間是http,沒有s的,這麼一來,就會致使重定向錯誤,假如你在使用https的時候,嘗試重定向到"/test"這個path去,實際上瀏覽器就會去訪問http://happyaa.com/test,這個不是你想要的結果;另外,因爲咱們訪問Tomcat是經過反向代理,那麼Tomcat所理解的客戶端的其實並非真實的瀏覽器客戶端,而是nginx,這樣真實的客戶端地址Tomcat就不知道了……這就是這兩個頭的目的,X-Forwarded-For傳遞原始客戶端真實地址,X-Forwarded-Proto傳遞原始的scheme(http或者https),接着還須要對Tomcat進行相應的配置,下面會提到.

證書能夠去找一個權威證書頒發機構獲取,也能夠本身弄一張自籤的,但自籤的證書瀏覽器不認,固然也能夠到wosign.org去獲取一個免費的——我就這麼幹的.證書相關的概念,能夠經過我這篇文章來了解:http://www.cnblogs.com/guogangj/p/4118605.html

tomcat的安裝與配置

關於tomcat的安裝,我以前有寫過相關的東西,能夠經過這個看到:http://www.cnblogs.com/guogangj/p/3725371.html#tomcatsetup

如今的tomcat的安裝和配置跟以前沒太大差異,只有這三點差異:
1, 不須要弄https了,https交給了nginx,tomcat就不須要弄了;
2, 要禁止外部直接訪問tomcat,我是經過RemoteAddrValve這個閥來控制的.
3, 另外再弄一個RemoteIpValve閥,用來處理nginx傳遞過來的X-Forwarded-For和X-Forwarded-Proto.關於這個的詳情,能夠[點此查看].

配置以下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- ... -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1" deny=""/>
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>
</Host>

我是將這個閥加在了Host節點中.這樣全部的外部的直接對tomcat的訪問都會直接得到403錯誤.

部署程序

沒什麼太多好說的,差很少就這些步驟:
1, 建立數據庫;
2, 調整程序自身的配置文件;
3, 上傳war包;
4, blah blah blah...

打開happyaa.com:

抓包看看,http頭中的server是什麼?應該是nginx.並且如今應該是http和https均可以用的,通常狀況下能夠用http,但若是網絡連的是公共區域的WIFI,不太放心的話,仍是要用https的.我發覺雖然沒有作什麼額外的優化,但訪問網頁的速度貌似快了不少,這並非心理做用,nginx確確實實能提升速度,至於爲何,我這裏摘錄知乎上的一段話:

對於後端是動態服務來講,好比Java和PHP。這類服務器(如JBoss和PHP-FPM)的IO處理能力每每不高。Nginx有個好處是它會把Request在讀取完整以前buffer住,這樣交給後端的就是一個完整的HTTP請求,從而提升後端的效率,而不是斷斷續續的傳遞(互聯網上鍊接速度通常比較慢)。一樣,Nginx也能夠把response給buffer住,一樣也是減輕後端的壓力。

原文地址: http://www.zhihu.com/question/19761434

待續

nginx除了是一個很是優秀的反向代理服務器以外,還有其它不少功能,好比緩存,這是大幅度提升網站性能的一個關鍵性的東西,配置且不算很複雜,不過我如今暫時不弄了,就咱們如今這點負荷,先不考慮了.高德納不是說過麼?過早的優化是萬惡之源.

相關文章
相關標籤/搜索