Nginx+Tomcat負載均衡、動靜分離群集全過程
一、 nginx 簡介
Nginx 是一款輕量級的高性能 Web 服務(wù)器、反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在 BSD-like 協(xié)議下發(fā)行。
其特點是占有內(nèi)存少,并發(fā)能力強,在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)優(yōu)異,常用于處理高并發(fā)場景。
1. 核心功能
高性能
- 采用事件驅(qū)動的異步非阻塞架構(gòu)(epoll/kqueue),單進程可處理數(shù)萬并發(fā)連接,資源消耗極低。
- 靜態(tài)文件處理速度極快,適合作為靜態(tài)資源服務(wù)器。
反向代理與負載均衡
- 支持 HTTP、HTTPS、SMTP、POP3、IMAP 等協(xié)議的代理轉(zhuǎn)發(fā)。
- 提供多種負載均衡算法(輪詢、IP 哈希、加權(quán)負載等),可自動檢測后端服務(wù)器健康狀態(tài)。
高可用性
- 支持熱部署,更新配置無需重啟服務(wù)。
- 通過
keepalive機制減少連接開銷,提升穩(wěn)定性。
模塊化設(shè)計
- 支持豐富的第三方模塊(如緩存、壓縮、認證等),可擴展性強。
2. 典型應(yīng)用場景
Web 服務(wù)器
- 直接托管靜態(tài)網(wǎng)站(HTML、CSS、JS、圖片等)。
- 通過
fastcgi模塊支持 PHP 等動態(tài)語言(需配合后端服務(wù))。
反向代理與負載均衡
- 作為前端代理服務(wù)器,隱藏真實后端服務(wù)器,提升安全性。
- 分攤流量到多個后端服務(wù)器,避免單點故障。
HTTP 終端代理
- 集中處理 SSL/TLS 加密,降低后端服務(wù)器負載。
API 網(wǎng)關(guān)
- 實現(xiàn)請求路由、限流、鑒權(quán)等功能。
3. 對比 apache
| 特性 | Nginx | Apache |
| 架構(gòu) | 事件驅(qū)動(異步非阻塞) | 多進程 / 線程(同步阻塞) |
| 并發(fā)處理 | 高(單進程數(shù)萬連接) | 中等(受進程 / 線程數(shù)限制) |
| 資源消耗 | 低 | 高 |
| 模塊擴展 | 需編譯時添加 | 運行時動態(tài)加載 |
| 配置復(fù)雜度 | 簡潔(基于塊結(jié)構(gòu)) | 靈活但復(fù)雜 |
4. 適用場景
- 高并發(fā)場景:如電商大促、流量突發(fā)的網(wǎng)站。
- 微服務(wù)架構(gòu):作為 API 網(wǎng)關(guān)或服務(wù)間的負載均衡器。
- 靜態(tài)資源服務(wù):托管前端項目、CDN 節(jié)點等。
5. 基礎(chǔ)配置示例
以下是一個簡單的 Nginx 配置文件片段,展示了靜態(tài)網(wǎng)站托管和反向代理的基本配置:
# 全局配置
worker_processes auto;
error_log /var/log/nginx/error.log warn;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 靜態(tài)網(wǎng)站配置
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# 反向代理配置
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_server:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}二、 tomcat 簡介
Apache Tomcat 是一個開源的 Servlet 容器,由 Apache 軟件基金會開發(fā)和維護。
它實現(xiàn)了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (EL) 和 WebSocket 等技術(shù)規(guī)范,是運行 Java Web 應(yīng)用程序的核心平臺。
1. 核心功能
輕量級
- 相比完整的 Java EE 應(yīng)用服務(wù)器(如 WebLogic、WebSphere),Tomcat 體積小、啟動快,適合開發(fā)和測試環(huán)境。
開源免費
- 基于 Apache License 2.0 發(fā)布,可自由使用和修改。
擴展性強
- 支持各種插件和連接器(如 APR、NIO2),可通過修改配置文件靈活調(diào)整。
與 Apache HTTP Server 集成
- 可作為后端 Servlet 容器,與 Apache HTTP Server 配合實現(xiàn)負載均衡。
2. 基本架構(gòu)
Tomcat 的核心組件包括:
- Server:代表整個 Servlet 容器,包含多個 Service
- Service:連接 Connector 和 Container
- Connector:負責(zé)接收客戶端請求(如 HTTP、HTTPS)
- Container:處理請求的核心組件,包含 Engine、Host、Context 等
- Web 應(yīng)用:部署在 Context 中的 WAR 或目錄
3. 典型應(yīng)用場景
Java Web 應(yīng)用部署
- 運行基于 Spring、Spring Boot、Struts 等框架開發(fā)的 Web 應(yīng)用。
微服務(wù)架構(gòu)
- 作為輕量級服務(wù)容器,部署獨立的微服務(wù)實例。
開發(fā)測試環(huán)境
- 快速啟動和調(diào)試 Web 應(yīng)用,支持熱部署。
與其他服務(wù)器配合
- 作為應(yīng)用服務(wù)器,與 Nginx/Apache HTTP Server 配合實現(xiàn)動靜分離。
4. 配置示例
以下是一個簡化的server.xml配置片段,展示了基本的 HTTP 連接器和虛擬主機配置:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Service name="Catalina">
<!-- HTTP連接器 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 引擎 -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 虛擬主機 -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>5. 與 nginx 的協(xié)作模式
在生產(chǎn)環(huán)境中,Tomcat 通常與 Nginx 配合使用:
Nginx 作為反向代理
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://tomcat_server:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}動靜分離
- Nginx 處理靜態(tài)資源(HTML、CSS、JS、圖片)
- Tomcat 處理動態(tài)請求(Servlet、JSP)
負載均衡
Nginx 通過 upstream 模塊將請求分發(fā)到多個 Tomcat 實例:
upstream tomcat_cluster {
server tomcat1:8080;
server tomcat2:8080;
}
server {
listen 80;
location / {
proxy_pass http://tomcat_cluster;
}
}6. 性能優(yōu)化建議
(1) 調(diào)整 JVM 參數(shù)
修改catalina.sh或setenv.sh,設(shè)置合適的堆內(nèi)存和垃圾回收器:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
(2) 優(yōu)化連接器
在server.xml中調(diào)整 HTTP 連接器參數(shù):
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
maxThreads="200" acceptCount="100" />(3) 禁用不必要的服務(wù)
注釋掉server.xml中不需要的組件(如 AJP 連接器)。
(4) 使用 APR 連接器
對于高并發(fā)場景,啟用 APR(Apache Portable Runtime)以提升性能:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" />
三、 實驗步驟
1. 實驗環(huán)境
部署nginx+tomcat負載均衡需要以下設(shè)備
| tomcat1 服務(wù)器 | 192.168.10.102 |
| tomcat2 服務(wù)器 | 192.168.10.103 |
| nginx 服務(wù)器 | 192.168.10.101 |
2. 準(zhǔn)備 tomcat 網(wǎng)站
##兩臺tomcat服務(wù)器配置一致
[root@localhost /]# dnf -y install java //安裝實驗需要的環(huán)境
[root@localhost /]# mkdir -p /web/webapp1
[root@localhost webapp1]# ls
index.jsp
##第一臺tomcat服務(wù)器
[root@localhost webapp1]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title> </head>
<body>
<% out.println("動態(tài)頁面 1,http://www.test2.com");%>
</body>
<body>
<div>動態(tài)頁面的圖片 1</div><br><img src="logo.png">
</body>
</html>
##第二臺tomcat服務(wù)器
[root@localhost webapp1]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title> </head>
<body>
<% out.println("動態(tài)頁面 2,http://www.test2.com");%>
</body>
<body>
<div>動態(tài)頁面的圖片 2</div><br><img src="logo.png"> ##為了方便驗證兩臺服務(wù)器頁面可以不一致
</body>
</html>3. 修改 nginx 的配置文件
[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf
##這個要寫在http部分
upstream my_tomcat {
server 192.168.10.102:8080 weight=1;
server 192.168.10.103:8080 weight=2;
}
##新添加的localtion部分
location ~ .*\.jsp$ {
proxy_set_header HOST $host;
proxy_pass http://my_tomcat;
}
##檢查配置文件是否有誤
[root@nginx /]# nginx -t
##重載nginx服務(wù)
[root@nginx /]# nginx -s reload4. 修改 tomcat 的配置文件
##兩臺服務(wù)器都要配置
[root@localhost /]# vim /usr/local/tomcat/conf/server.xml
<Context docBase="/web/webapp1" path="" reloadable="false"> ##在150行添加
</Context>
docBase ##指定網(wǎng)頁的路徑
path="" ##定義 Web 應(yīng)用的訪問路徑(上下文路徑)
reloadabel ##控制 Tomcat 是否自動檢測應(yīng)用文件的修改并重新加載應(yīng)用
false(默認值) ##不自動重新加載,修改文件后需手動重啟 Tomcat 或應(yīng)用。
true ##開啟自動重新加載
##重啟兩臺服務(wù)器,使配置文件生效
[root@localhost /]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost /]# /usr/local/tomcat/bin/startup.sh5. 驗證


總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Windows下使用?Nginx?搭建?HTTP文件服務(wù)器?實現(xiàn)文件下載功能
Nginx?是一款輕量級的?HTTP?服務(wù)器,采用事件驅(qū)動的異步非阻塞處理方式框架,這讓其具有極好的?IO?性能,時常用于服務(wù)端的反向代理和負載均衡,這篇文章主要介紹了Windows下使用?Nginx?搭建?HTTP文件服務(wù)器實現(xiàn)文件下載功能,需要的朋友可以參考下2023-03-03
Nginx緩存Cache的配置方案以及相關(guān)內(nèi)存占用問題解決
這篇文章主要介紹了Nginx緩存Cache的配置方案以及相關(guān)內(nèi)存占用問題解決,Cashe配置最主要的還是需要注意內(nèi)存資源的使用問題,需要的朋友可以參考下2016-01-01
nginx加php-fpm出現(xiàn)502 bad gateway錯誤的5種解決方法
這篇文章主要介紹了nginx加php-fpm環(huán)境中出現(xiàn)502 bad gateway錯誤的5種解決方法,總結(jié)歸納服務(wù)器出現(xiàn)502錯誤的原因多數(shù)為連接過多和腳本超時,本文總結(jié)了5種解決方法,需要的朋友可以參考下2014-05-05
Nginx設(shè)置HttpOnly Secure SameSite參數(shù)解決Cookie信息丟失
本文主要介紹了Nginx中Cookie缺少SameSite屬性的問題,并詳細解釋了HttpOnly、Secure和SameSite屬性的作用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
Nginx HTTP:413 Request Entity Too Large解決方法
這篇文章主要介紹了Nginx HTTP:413 Request Entity Too Large解決方法,這個問題需要修改PHP配置以及Nginx配置才可以解決,需要的朋友可以參考下2015-07-07
nginx里的rewrite跳轉(zhuǎn)的實現(xiàn)
這篇文章主要介紹了nginx里的rewrite跳轉(zhuǎn)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
nginx外網(wǎng)訪問內(nèi)網(wǎng)站點配置操作
這篇文章主要介紹了nginx外網(wǎng)訪問內(nèi)網(wǎng)站點配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Nginx訪問FTP服務(wù)器文件的時效性/安全校驗的方法
nginx的實現(xiàn)方式在校驗失敗的時候頁面返回error image,跳轉(zhuǎn)的是420 error_page,成功的時候會訪問FTP文件服務(wù)器的路徑,反正圖片到頁面展示,這篇文章主要介紹了Nginx訪問FTP服務(wù)器文件的時效性/安全校驗,需要的朋友可以參考下2023-12-12

