1)要用到的軟體當然要下載囉。到nginx官網下一個。 http://nginx.org/en/download.html可以到這裡去下。我現在用的版本是1.1.7,但基本上以後的版本都相容,而且我們用到的並不涉及到太底層的,應該不會有什麼變化。這裡,由於我的是windows,當然下windows版啦。下完後首先要啟動吧。進入到nginx資料夾,直接start nginx就ok了。例如我下載後放在d:\software\developertools\server\nginx-1.1.7,直接cmd後cd d:\software\developertools\server\nginx-1.1.7,有些不習慣命令列的可能會很奇怪,它沒有進行到那個資料夾。 windows並不會在分區間跳轉,除非你自己指定了。所以我們要直接d:如下:
然後,我們直接start nginx,這裡也許你會看到一個視窗一閃而過,根據我們使用tomcat的經驗,如果一閃而過,證明有錯了,對吧?但實際上不是。
此時我們開啟工作管理員,可以看到兩個nginx.exe在那裡好好的。這說明我們已經啟動了,至於為什麼兩個,我們這裡不深究。
現在,我們已經啟動了nginx,這時就可以啟動tomcat,想著直接訪問http://localhost就可以直接存取tomcat了。先不急,我們來看看啟動後的nginx是怎麼樣的。直接訪問http://localhost可以看到:
我們可以看到nginx啟動成功,現在存取是直接進入nginx的目錄裡面了。那麼這些實際上是在哪裡配置的。這就牽涉到nginx的一個重要設定檔nginx.conf了。
2)我們可以看到nginx資料夾內有一個conf資料夾,其中有好幾個文件,其他先不管,我們打開nginx.conf,可以看到一段:
這段程式碼在server裡面,相當於一個代理伺服器,當然可以配置多個。下面我們仔細來分析一下:listen:表示目前的代理伺服器監聽的端口,預設的是監聽80端口。注意,如果我們設定了多個server,這個listen要設定不一樣,不然就不能確定到哪裡去了。 server_name:表示監聽到之後需要轉到哪裡去,這時我們直接轉到本地,這時是直接到nginx資料夾內。 location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這裡root:裡面配置了root這時表示當匹配這個請求的路徑時,將會在這個資料夾內尋找相應的文件,這裡對我們之後的靜態文件伺服很有用。 index:當沒有指定主頁時,預設會選擇這個指定的文件,它可以有多個,並按順序來加載,如果第一個不存在,則找第二個,依此類推。下面的error_page是代表錯誤的頁面,這裡我們暫時不用,先不管它。
那我們知道了具體的設定了,怎麼讓它存取localhost時轉到tomcat時。實際上就修改兩個地方:
server_name localhost:8080; location / { proxy_pass http://localhost:8080}
我們就修改了上面兩個地方,我的tomcat在8080端口,可以根據自己的需要修改。這裡有一個新元素proxy_pass,它表示代理路徑,相當於轉發,而不像之前說的root必須指定一個資料夾。此時我們修改了文件,是不是就意思著必須先關了nginx再重新啟動了,其實不必,nginx可以重新載入文件的。我們直接跑:nginx -s reload
高興得太早了,我們發現有一個錯誤:
什麼來的,45行發現錯誤,不希望在那一行找到},於是我們仔細找,發現我們加入的proxy_pass很奇怪,沒有;號結尾,這就是問題了,直接修改,然後再運行一下,發現沒錯誤,ok了。如果不想直接加載,而只是想看看自己的設定檔有沒有問題,可以直接輸入:nginx -t
這可以檢查設定檔中是否有錯。下面我們所有的修改都假設我們修改完成後運行了nginx -s reload進行重新加載配置文件,請注意。
一切沒問題了,然後我們再重新開啟http://localhost,我們看到下面的頁面:
这时,我们发现它并不是刚才的welcome页面了,而是tomcat的管理页面了,不管我们点击什么链接都是没问题的,相当于直接访问http://localhost:8080一样。
3)上面我们直接试了一个小例子,让nginx进行转发,即所谓的反向代理。但实际上我们的需求不会是这样的,我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet容器,没办法处理jsp,而html,js,css这些不需要处理的,直接给nginx进行缓存。下面我们来进行一下配置,让jsp页面直接给tomcat,而html,png等一些图片和js等直接给nginx进行缓存。这时最主要用的还是location这个元素,并且涉及到一部分正则,但不难:
location ~ .jsp$ { proxy_pass http://localhost:8080;} location ~ .(html|js|css|png|gif)$ { root d:/software/developertools/server/apache-tomcat-7.0.8/webapps/root;} location ~ .jsp$ { proxy_pass http://localhost:8080;} location ~ .(html|js|css|png|gif)$ { root d:/software/developertools/server/apache-tomcat-7.0.8/webapps/root;}
我们先要去掉之前配的location /,避免全部请求被拦截了。然后我们再来看看http://localhost
当我们不指定jsp页面的时候,它会出现找不到,因为,此时并没有相应的location匹配,所以就会有404错误,这时就跳到了nginx自定义的error页面去了。而当我们用http://localhost/index.jsp去访问时,我们看到了熟悉的页面:
而且图片那些都显示正常,因为图片是png的,所以直接在tomcat/webapps/root目录下直接查找,当然,如果我们点击manager application how-to这个链接,我们发现:
它还是找不到,为什么呢?因为这是个html页面,但它并不在root目录下,而是在docs目录下,但当我们匹配html时,我们却到root目录下去找,所以还是找不到这个页面。
一般情况下,如果我们需要用nginx来进行静态文件伺服,一般都会把所有静态文件,html,htm,js,css等都放在同一个文件夹下,这样就不会有tomcat这样的情况了,因为tomcat下的是属于不同的项目,这个我们就没办法了。
3)有些人会说,这些都只会找一台服务器,但如果我们想在一台服务器挂了的时候,自动去找另外一台,这怎么办?这实际上nginx都考虑到了。这时,我们之前用的proxy_pass就有大用途了。我们把之前的第一个例子,即全部都代理的修改一下:最后修改如下:
upstream local_tomcat { server localhost:8080;} server{ location / { proxy_pass http://local_tomcat; } ##......其他省略 } upstream local_tomcat { server localhost:8080;} server{ location / { proxy_pass http://local_tomcat; } #......其他省略 }
我们在server外添加了一个upstream,而直接在proxy_pass里面直接用http://+upstream的名称来使用。我们还是直接来http://localhost,还是和第一个一样的效果,所有链接都没问题,说明我们配置正确。upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加。我们刚才说可以在一个服务器挂了的情况下连到另外一个,那怎么弄呢?其实很简单,在upstream中的local_tomcat中配置多一个server。比如我现在弄多一个jetty,端口在9999,所以我们配置如下:
upstream local_tomcat { server localhost:8080; server localhost:9999;} upstream local_tomcat { server localhost:8080; server localhost:9999;}
此时,我们关闭tomcat,而只开jetty。我们来运行http://localhost看看效果: 我们看到它请求到了jetty的页面,但由于jetty的机制,这时没有显示jetty主页,这个我们先不管。但我们的在一个服务器挂的情况下自动使用另外一个的功能实现了。
但有时我们就不想它挂的时候访问另外一个,而只是希望一个服务器访问的机会比另外一个大,这个可以在server最后加上一个weight=数字来指定,数字越大,表明请求到的机会越大。
upstream local_tomcat { server localhost:8080 weight=1; server localhost:9999 weight=5;} upstream local_tomcat { server localhost:8080 weight=1; server localhost:9999 weight=5;}
这时我们给了jetty一个更高的权值,让它更有机会访问到,实际上当我们刷新http://localhost访问的时候发现jetty访问机率大很多,tomcat几乎没机会访问,一般情况下,如果我们必须这样用,不要相关太大,以免一个服务器负载太大。当然,server还有一些其他的元素,比如down表示暂时不用到该服务器等等。
以上是Nginx怎麼為Tomcat伺服器作反向代理的詳細內容。更多資訊請關注PHP中文網其他相關文章!