tomcat 與 nginx,apache的區別是什麼?

這三者都是web server,那他們各自有什麼特點呢?他們之間的區別是什麼呢?

nginx 和 tomcat在性能上面有何異同。

tomcat用在java後台程序上,java後台程序難道不能用apache和nginx嗎?


題主說的Apache,指的應該是Apache軟體基金會下的一個項目——Apache HTTP Server Project;Nginx同樣也是一款開源的HTTP伺服器軟體(當然它也可以作為郵件代理伺服器、通用的TCP代理伺服器)。

HTTP伺服器本質上也是一種應用程序——它通常運行在伺服器之上,綁定伺服器的IP地址並監聽某一個tcp埠來接收並處理HTTP請求,這樣客戶端(一般來說是IE, Firefox,Chrome這樣的瀏覽器)就能夠通過HTTP協議來獲取伺服器上的網頁(HTML格式)、文檔(PDF格式)、音頻(MP4格式)、視頻(MOV格式)等等資源。下圖描述的就是這一過程:

不僅僅是Apache HTTP Server和Nginx,絕大多數編程語言所包含的類庫中也都實現了簡單的HTTP伺服器方便開發者使用:

  • HttpServer (Java HTTP Server )

  • Python SimpleHTTPServer

使用這些類庫能夠非常容易的運行一個HTTP伺服器,它們都能夠通過綁定IP地址並監聽tcp埠來提供HTTP服務。

Apache Tomcat則是Apache基金會下的另外一個項目,與Apache HTTP Server相比,Tomcat能夠動態的生成資源並返回到客戶端。Apache HTTP Server和Nginx都能夠將某一個文本文件的內容通過HTTP協議返回到客戶端,但是這個文本文件的內容是固定的——也就是說無論何時、任何人訪問它得到的內容都是完全相同的,這樣的資源我們稱之為靜態資源。動態資源則與之相反,在不同的時間、不同的客戶端訪問得到的內容是不同的,例如:

  • 包含顯示當前時間的頁面

  • 顯示當前IP地址的頁面

Apache HTTP Server和Nginx本身不支持生成動態頁面,但它們可以通過其他模塊來支持(例如通過Shell、PHP、Python腳本程序來動態生成內容)。

如果想要使用Java程序來動態生成資源內容,使用這一類HTTP伺服器很難做到。Java Servlet技術以及衍生的Java Server Pages技術可以讓Java程序也具有處理HTTP請求並且返回內容(由程序動態控制)的能力,Tomcat正是支持運行Servlet/JSP應用程序的容器(Container):

Tomcat運行在JVM之上,它和HTTP伺服器一樣,綁定IP地址並監聽TCP埠,同時還包含以下指責:

  • 管理Servlet程序的生命周期
  • 將URL映射到指定的Servlet進行處理
  • 與Servlet程序合作處理HTTP請求——根據HTTP請求生成HttpServletResponse對象並傳遞給Servlet進行處理,將Servlet中的HttpServletResponse對象生成的內容返回給瀏覽器

雖然Tomcat也可以認為是HTTP伺服器,但通常它仍然會和Nginx配合在一起使用:

  • 動靜態資源分離——運用Nginx的反向代理功能分發請求:所有動態資源的請求交給Tomcat,而靜態資源的請求(例如圖片、視頻、CSS、JavaScript文件等)則直接由Nginx返回到瀏覽器,這樣能大大減輕Tomcat的壓力。
  • 負載均衡,當業務壓力增大時,可能一個Tomcat的實例不足以處理,那麼這時可以啟動多個Tomcat實例進行水平擴展,而Nginx的負載均衡功能可以把請求通過演算法分發到各個不同的實例進行處理


Web Server 的概念太寬泛了。

嚴格的來說,Apache/Nginx 應該叫做「HTTP Server」;而 Tomcat 則是一個「Application Server」,或者更準確的來說,是一個「Servlet/JSP」應用的容器(Ruby/Python 等其他語言開發的應用也無法直接運行在 Tomcat 上)。

一個 HTTP Server 關心的是 HTTP 協議層面的傳輸和訪問控制,所以在 Apache/Nginx 上你可以看到代理、負載均衡等功能。客戶端通過 HTTP Server 訪問伺服器上存儲的資源(HTML 文件、圖片文件等等)。通過 CGI 技術,也可以將處理過的內容通過 HTTP Server 分發,但是一個 HTTP Server 始終只是把伺服器上的文件如實的通過 HTTP 協議傳輸給客戶端。

而應用伺服器,則是一個應用執行的容器。它首先需要支持開發語言的 Runtime(對於 Tomcat 來說,就是 Java),保證應用能夠在應用伺服器上正常運行。其次,需要支持應用相關的規範,例如類庫、安全方面的特性。對於 Tomcat 來說,就是需要提供 JSP/Sevlet 運行需要的標準類庫、Interface 等。為了方便,應用伺服器往往也會集成 HTTP Server 的功能,但是不如專業的 HTTP Server 那麼強大,所以應用伺服器往往是運行在 HTTP Server 的背後,執行應用,將動態的內容轉化為靜態的內容之後,通過 HTTP Server 分發到客戶端。


web上的server都叫web server,但是大家分工也有不同的。

nginx常用做靜態內容服務和代理伺服器(不是你翻牆那個代理),直面外來請求轉發給後面的應用服務(tomcat,django什麼的),tomcat更多用來做做一個應用容器,讓java web app跑在裡面的東西,對應同級別的有jboss,jetty等東西。

但是事無絕對,nginx也可以通過模塊開發來提供應用功能,tomcat也可以直接提供http服務,通常用在內網和不需要流控等小型服務的場景。

apache用的越來越少了,大體上和nginx功能重合的更多。


其實可以說沒有什麼區別,HTTP Server本質上來說都是這樣幾件事:

  1. 監聽埠
  2. 接收(accept)socket連接
  3. 解析HTTP請求
  4. 使用通用或專用協議對請求進行分發
  5. 接收分發的請求產生的運行結果
  6. 將結果格式化成HTTP Response並寫到socket裡面
  7. 關閉連接或者Keep-Alive

區別一方面在於用了什麼語言來實現(Tomcat用Java),一方面是分發時支持的具體協議,Tomcat只支持Servlet介面,Apache和nginx支持CGI、FastCGI、反向代理(可以認為是用HTTP協議進行HTTP請求的分發)、靜態資源(可以認為是分發到磁碟讀寫)等,還可以用擴展模塊支持其他分發方式(比如WSGI)。除此以外就都是實現方式的問題了。


我們進一步可以說一下進程內分發和進程外分發的問題,有些分發方式是進程內分發的,需要通過內存傳遞一些對象,這種分發方式通常也是綁定語言的,所以一般必須用相應的語言實現(比如Servlet);某些語言有特殊的FFI(如Python有C API),也可以通過FFI的方式調用。另一些分發方式是進程外的,只要序列化格式匹配就可以在不同語言之間通用,如FastCGI、HTTP等,這些分發就可以用統一的方法。


apache和nginx可以歸為一類,屬於靜態頁面伺服器。tomcat屬於Java Servlet容器,用來生成動態頁面的。

apache屬於比較老的靜態頁面伺服器,比較多現有插件,包括代理、SSL支持、動態編程語言處理等。

nginx和apache差不多,都有插件支持動態編程語言處理等、但nginx的IO模型比apache更適合跑代理。所以一般都作為前端緩衝代理。

tomcat就是Java Servlet容器,主要用來跑Java的Web功能,當然也提供一個簡單靜態頁面轉換。


我們首先來看看三個內容的含義:

什麼是nginx?

nginx is a free,open-source,high-performance http server and reverse proxy,as well as an IMAP/POP3 proxy.通俗的說Nginx提供web服務,反向代理,以及IMAP/POP3代理,那麼什麼是web服務?反向代理?IMAP/POP3代理?

web服務:服務端通過網路可以提供給客戶端所請求的資源,

反向代理:代表資源伺服器來回應客戶端的請求(或者正向代理的請求),至於資源伺服器為什麼不自己回應,想想被告與被告律師的關係(被告的律師看做反向代理,被告是什麼?自己猜吧(ˇ?ˇ) 想~),正向代理是什麼?原告的代理律師就是正向代理)

IMAP/POP3:是一種stream傳輸協議,常常被用來做一些郵件傳輸

IMAP:Internet Mail Access Protocol 是一種互動式的郵件郵件傳輸協議,互動式說的就是客戶端可以和服務端針對郵件的各種操作同步,一份郵件,客戶端有,服務端也有,客戶端有什麼操作會同步到服務端,反之亦然。

POP3:Post Office Protocol 3郵件傳輸協議相比IMAP協議只是伺服器不保留郵件,一旦給了客戶端,自行刪除對應的郵件,客戶端對郵件的各種操作與伺服器無關

好煩:都是文字一點可讀性都沒有,找個圖片吧

PorxyreverseProxy

(注意代理的概念只要把握准正向和反向都是以客戶端為參考的,從客戶端出的是正向,客戶端接受的是反向)

扯了半天其他的東西,現在是nginx的時間:

學習一個東西吾以為了解其框架架構,最初是出於什麼目的設計,為解決什麼問題,以及怎樣設計是最重要的,所以下面的重點就是這些:

為什麼會出現nginx或者其他相似功能的web服務,一方面是因為http的歷史局限型,而最重要的還是C10K問題,高並發訪問,好吧什麼歷史局限型,說的通俗點就是httpd(apache)老了不太能適應現在的網路環境了,畢竟人家Apache是95年的東西了,現代的計算機網路已經和當時遠遠不同了,倒不如說現在還大量使用httpd已經是一個小奇蹟了(之所以不說奇蹟,就擔心較真的人太過在意,畢竟做it較真的人還是很多大的,畢竟我就是一個較真的人),還有一個問題C10K,什麼意思?The C10k problem is the problem of optimising network sockets to handle a large number of clients at the same time.The name C10k is a numeronym for concurrently handling ten thousand connections.Apache的致命缺陷就是同時不可以處理一萬個請求(建立套接字處理),對電商站點的影響,自己(╯▽╰)

Nginx戰鬥民族設計的一款輕量級的web服務,免費開源,高性能:

nginxArchitecture

一個master進程負責生產各種子進程,為什麼要說是各種?緣由在於其每個子進程所具有的功能可以是nginx所有功能的一部分,也可以是全部。這個在於我們背鍋俠的設置了,當然nginx的一些基本功能,每個子進程是必須要有的。看到連接後端的HTTP,FastCGI以及memcache了么,這些都是連接後端伺服器(也叫Backend)的協議,HTTP協議,FastCGI協議以及memcached分散式緩存系統。

二、什麼是Tomcat?

是由Apache軟體基金會下屬的Jakarta項目開發的一個Servlet容器,實現了對Servlet和JavaServer Page(JSP)的支持,並提供了作為Web伺服器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat閥等。由於Tomcat本身也內含了一個HTTP伺服器,它也可以被視作一個單獨的Web伺服器。但是,不能將Tomcat和Apache HTTP伺服器混淆,Apache HTTP伺服器是一個用C語言實現的HTTPWeb伺服器;這兩個HTTP web server不是捆綁在一起的。Apache Tomcat包含了一個配置管理工具,也可以通過編輯XML格式的配置文件來進行配置。

Servlet(Server Applet),全稱Java Servlet。是用Java編寫的伺服器端程序。其主要功能在於互動式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的類,一般情況下,人們將Servlet理解為後者。

Servlet運行於支持Java的應用伺服器中。從實現上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web伺服器。最早支持Servlet標準的是JavaSoft的Java Web Server。

通用Servlet

一般來說,通用Servlet由javax.servlet.GenericServlet實作Servlet界面。程序設計人員可以通過使用或繼承這個類來實現通用Servlet應用。

HttpServlet

javax.servlet.http.HttpServlet實現了專門用於響應HTTP請求的Servlet,提供了響應對應HTTP標準請求的doGet()、doPost()等方法。

生命周期

當servlet被部署在應用伺服器中(應用伺服器中用於管理Java組件的部分被抽象成為容器)以後,由容器控制servlet的生命周期。除非特殊指定,否則在容器啟動的時候,servlet是不會被載入的,servlet只會在第一次請求的時候被載入和實例化。servlet一旦被載入,一般不會從容器中刪除,直至應用伺服器關閉或重新啟動。但當容器做內存回收動作時,servlet有可能被刪除。也正是因為這個原因,第一次訪問servlet所用的時間要大大多於以後訪問所用的時間。

servlet在伺服器的運行生命周期為,在第一次請求(或其實體被內存垃圾回收後再被訪問)時被載入並執行一次初始化方法,跟著執行正式運行方法,之後會被常駐並每次被請求時直接執行正式運行方法,直到伺服器關閉或被清理時執行一次銷毀方法後實體銷毀。

與JSP的關係

Java伺服器頁面(JSP)是HttpServlet的擴展。由於HttpServlet大多是用來響應HTTP請求,並返回Web頁面(例如HTML、XML),所以不可避免地,在編寫servlet時會涉及大量的HTML內容,這給servlet的書寫效率和可讀性帶來很大障礙,JSP便是在這個基礎上產生的。其功能是使用HTML的書寫格式,在適當的地方加入Java代碼片段,將程序員從複雜的HTML中解放出來,更專註於servlet本身的內容。

JSP在首次被訪問的時候被應用伺服器轉換為servlet,在以後的運行中,容器直接調用這個servlet,而不再訪問JSP頁面。JSP的實質仍然是servlet。

JSP(全稱JavaServer Pages)是由Sun Microsystems公司倡導和許多公司參與共同創建的一種使軟體開發者可以響應客戶端請求,而動態生成HTML、XML或其他格式文檔的Web網頁的技術標準。JSP技術是以Java語言作為腳本語言的,JSP網頁為整個伺服器端的Java庫單元提供了一個介面來服務於HTTP的應用程序。

JSP使Java代碼和特定的預定義動作可以嵌入到靜態頁面中。JSP句法增加了被稱為JSP動作的XML標籤,它們用來調用內建功能。另外,可以創建JSP標籤庫,然後像使用標準HTML或XML標籤一樣使用它們。標籤庫提供了一種和平台無關的擴展伺服器性能的方法。

JSP被JSP編譯器編譯成Java Servlets。一個JSP編譯器可以把JSP編譯成JAVA代碼寫的servlet然後再由JAVA編譯器來編譯成機器碼,也可以直接編譯成二進位碼。

SP和Servlets

從架構上說,JSP可以被看作是從Servlets高級提煉而作為JAVA Servlet 2.1 API的擴展而應用。Servlets和JSP最早都是由Sun Microsystems(太陽公司)開發的。從JSP1.2版本以來,JSP處於Java Community Process開發模式下。

靜態數據在輸入文件中的內容和輸出給HTTP響應的內容完全一致。此時,該JSP輸入文件會是一個沒有內嵌JAVA或動作的HTML頁面。而且,客戶端每次請求都會得到相同的響應內容。

什麼是apache?

互聯網這個歷史已經不算很短了,它大大方便了人類獲取信息,開闊了人類的眼界,使得讓這個世界變得小了起來,人與人之間的距離感也不會存在了,娛樂也更加豐富,聽音樂、看電影等等這一系列,都能從網上進行,這些功能,都是由www伺服器來提供服務,在Linux中,提供網路的伺服器有很多種,那麼今天我們就講一個比較老牌,且依然能存活的伺服器「阿帕奇」英文:Apache。

一、Apache簡介

Apache HTTP Server(簡稱Apache)是Apache軟體基金會的一個開放源代碼的網頁伺服器軟體,可以在大多數電腦操作系統中運行,由於其跨平台和安全性。被廣泛使用,是最流行的Web伺服器軟體之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python等解釋器編譯到伺服器中。

二、特性

Apache支持許多特性,大部分通過編譯的模塊實現。這些特性從伺服器端的編程語言支持到身份認證方案。一些通用的語言介面支持Perl,Python,Tcl, 和PHP。流行的認證模塊包括mod_access,mod_auth和mod_digest。其他的例子有SSL和TLS支持(mod_ssl),代理伺服器(proxy)模塊,很有用的URL重寫(由mod_rewrite實現),定製日誌文件(mod_log_config),以及過濾支持(mod_include和mod_ext_filter)。Apache日誌可以通過網頁瀏覽器使用免費的腳本AWStats或Visitors來進行分析。

三、工作流程

Apache工作在應用層,是實現http協議的伺服器軟體之一,http是超文本傳輸協議,工作於應用層tcp的80埠,用戶發起http協議的請求報文,伺服器收到之後進行對客戶端的響應,客戶端收到之後,通過瀏覽器顯示,其背後為html語言。而html是超文本標記語言,那麼一次完整的http報文請求處理過程以如下步驟進行:

1、建立或處理連接:接收請求或拒絕請求。

2、接收請求:接收來自於網路上的主機請求報文中對某些特定資源的一次請求過程。

3、處理請求:對請求報文進行分析,獲取客戶端進行請求的資源以及請求方法等相關信息。

4、訪問資源:獲取請求報文中的請求資源。

5、構建響應報文。

6、發送響應報文。

7、記錄日誌。

四、版本的變革

早期發布的是apache-1.3,不過現在已經停止支持,之後發布了2.2的版本,但不支持event事件驅動機制,現在最新的版本是2.4,我們就以2.4為例進行說明。

五、操作流程

5.1 安裝

我們都知道在Linux系統當中的安裝方式無非有兩種,一種是RPM包(RedHat公司提供的二進位包)安裝,報名叫httpd,其服務程序也叫httpd,另一種是共官方網站上去下載源碼包來進行安裝,在本次的實驗中,這兩種方式我們都會進行,其配置方式也是不盡相同,如果你配置好yum倉庫,現在就可以很簡單的以RPM方式來進行安裝,我們使用以下命令:

[root@node1 ~]# yum -y install httpd

就這一條命令,我們的RPM包就安裝好了,可以直接啟動程序打開瀏覽器來訪問

[root@node1 ~]# systemctl start httpd.service

打開瀏覽器,訪問方式直接輸入IP地址就可以,因為http協議瀏覽器自動加上去的,如果看到了apache的測試頁,則證明你成功了。

那麼為什麼可以成功?我們可以使用ss命令用來查看:

[root@node1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*

從以上命令顯示我們看出,當服務啟動時,就會開啟80埠,我們說過,80埠是提供WEB服務的。

以上就是以RPM包方式的安裝,那麼現在我們看一下如何以源碼包方式進行安裝,源碼包的安裝過程方式很是繁雜,但是其有點是可以自由定製功能,我們使用--enable來使用是否開啟次功能,--with用來是否添加此功能,還可以用 --with-out用來取消此功能,意思是在安裝上默認添加的功能給去除掉,現在我們可以從官網上下載源碼包,其下載地址為:http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.25.tar.gz,直接複製就能夠下載,在Linux上,使用wget就可以。

[root@node1 ~]# wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.25.tar.gz

下載完成之後,由於是壓縮包,所以我們必須要解壓才能夠使用安裝,把它解壓到/usr/src/目錄下。

[root@node1 ~]# tar -xf httpd-2.4.25.tar.gz -C /usr/src/

之後我們下載兩個依賴包,一個是apr包,另一個是apr-util包,那麼apr是什麼?其實它是一個底層支撐Apache跨平台特性的一個安裝包,有了這個包就可以不用修改整個程序,就像是一個虛擬機一樣,提供一個環境讓系統跑起來,apache也亦是如此,現在我們可以使用wget命令下載下來:

[root@node1 src]# wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.gz
[root@node1 src]# wget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz

下載完成之後,由於都在/usr/src的目錄下,所以就直接加壓。

[root@node1 src]# tar -xf apr-1.5.2.tar.gz
[root@node1 src]# tar -xf apr-util-1.5.4.tar.gz

我們首先進入apr目錄,開始安裝,不過在安裝之前,我們首先要安裝開發包組:

[root@node1 ~]# yum -y groupinstall "Development Tools" "Server Platform Development"
[root@node1 src]# cd apr-1.5.2/
[root@node1 apr-1.5.2]# ./configure --prefix=/usr/local/apr-1.5
[root@node1 apr-1.5.2]# make make install
[root@node1 src]# cd apr-util-1.5.4/
[root@node1 apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util-1.5 --with-apr=/usr/local/apr-1.5

如果以上程序包都安裝完成的話,恭喜你,可以安裝http了,首先進入該目錄,之後進行安裝,如果中途出現一些錯誤的話,是可以解決的。

[root@node1 httpd-2.4.25]# ./configure --prefix=/usr/local/apache-2.4 --enable-so --enable-ssl --with-pcre --with-rewrite --with-mpm=prefork --enable-cgi --with-zlib --with-libxml2=/usr --with-apr=/usr/local/apr-1.5 --with-apr-util=/usr/local/apr-util-1.5 --with-openssl --enable-modules=most --enable-mpms-shared=all
[root@node1 httpd-2.4.25]# make make install

之後打開瀏覽器,步驟一樣,輸入IP,只不過出現的是 It Works的頁面。

安裝過程中,可能會報錯,但這些錯誤都可以解決,以上成功的話,則代表第一階段完成。

接下來可以啟動源碼包安裝的程序,不過必要先要關閉RPM包的apache,因為一個埠不能為兩個程序所使用。

[root@node1 ~]# /usr/local/apache-2.4/bin/apachectl start

5.2 配置介紹

其實兩種安裝方式任意選一種都可以,畢竟這只是實驗,並沒有好壞,最後的配置方法都是差不多的,接下來說一下配置文件的詳解,以及我們可以搭建什麼服務,我們就以RPM包所安裝的來進行配置,我們的主配置文件在/etc/httpd/conf和/etc/httpd/conf.d,注意:我們要把主配置文件複製出來進行備份,不然的話,如果到了不可挽回的餘地,最起碼覆蓋掉,解決一下,從頭再來,那麼其配置結構如下:

我們使用的響應模型是默認是prefork,它是開啟多個進程來處理不同的請求,其模式共有三個,另外兩個是worker和event模型,那麼我們首先來介紹一下prework模型,它是一個多進程模型,由一個主進程和多個子進程組成,一個主進程負責創建和銷毀子進程以及套接字,也負責接收請求,並將請求轉發到子進程來進行處理。那麼多個子進程,每一個子進程分別處理一個請求,其工作模型為會預先生成幾個空閑進程,用來等待處理用戶請求。

接下來是worker模型,它是多進程多線程的模型,有一個主進程和多個子進程,主進程和以上一樣,創建並銷毀子進程以及建立套接字並接受請求,然後將請求轉發給子進程,而多個子進程卻沒有直接處理請求,而是交給了它所生成的線程處理,每個子進程生成多個線程,每個線程都會去響應用戶請求。其並發的響應數量為 m*n。

最後一個是event模型,它是一個事件驅動的模型,每個進程響應多個用戶請求,也是由一個主進程個子進程組成,主進程的功能和以上的兩種模式一樣,那麼子進程是基於事件驅動直接響應多個用戶請求,在httpd-2.4中是支持的。

以上就是對模式的介紹,那麼接下來其它文件的位置,我們安裝完成之後就必然開啟它進行web服務,那麼在 CentOS 6中,它的服務腳本在/etc/rc.d/init.d/httpd路徑下,站點文件在/var/www/html的路徑下,為什麼會配置在哪兒?因為在httpd.conf配置文件中,定義了DocumentRoot "/var/www/html"的文檔根目錄,日誌文件保存在/var/log/httpd目錄下,訪問日誌為access_log錯誤日誌為error_log。服務控制和啟動在CentOS7是不一樣的,分別是:

CentOS 6:

[root@node1 ~] # service httpd { start | stop | restart | status }

CentOS 7:

[root@node1 ~] # systemctl { start | stop | restart | status } https.service

5.3 配置別名及認證方式和虛擬主機

5.3.1 配置別名

在配置文件下使用alias來定義別名,其格式如下:

[root@node1 conf.d]# vim alias.conf
Alias /web1/ /web/html1/
&
options None
allowOverride None
Require all granted
&
[root@node1 ~]# systemctl reload httpd.service

接下來為定義的配置文件建立目錄。

[root@node1 conf.d]# mkdir /web/html1 -pv

定義主頁。

[root@node1 conf.d]# cd /web/html1/
[root@node1 html1]# vim index.html
&Alias Page&

打開瀏覽器訪問。

5.3.2 認證服務

認證其實很好理解,就是讓用戶向伺服器提供用戶名和密碼,這是證明自己的一種手段,其配置如下:

[root@node1 ~]# cd /etc/httpd/conf.d/
[root@node1 ~]# vim auth.conf
Alias /apps/ "/apps/html/"
&
Options None
AllowOverride None
Authtype basic
AuthUserFile "/apps/html/.htpasswd"
AuthName "Admin String"
Require valid-user
&
[root@node1 conf.d]# cd /apps/html/
[root@node1 html]# vim index.html
&Auth Page& [root@node1 ~]# systemctl reload httpd.service

重新啟動打開瀏覽器進行訪問,輸入用戶名和密碼就可以,創建用戶和密碼的命令是htpasswd,格式如下:

[root@node1 conf.d]# htpasswd -c -m /apps/html/.htpasswd user1

5.3.3 虛擬主機服務

虛擬主機是可以在一個主機上提供多個訪問站點,共有三種實現方案,分別是基於IP、基於埠、基於域名,我們就以基於域名的方式來配置虛擬主機,配置如下:

[root@node1 conf.d]# vim vhost.conf
&
ServerName www1.stux.com
DocumentRoot "/apps/www"
&
Options None
AllowOverride None
Require all granted
&
&
[root@node1 ~]# mkdir /apps/www
[root@node1 ~]# vim /apps/www/index.html
&Test Virtual Page& [root@node1 ~]# systemctl reload httpd.service

現在我們可以測試一下,如果成功,那我恭喜你。

各種不同 @David 已經說得非常精準了。

你想更深入了解學習Linux知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Linux雲計算從入門到精通》系列實戰筆記全放送


其實,再仔細的給題主的列出的幾種分下類,可能會好理解些。

「這三者都是web server」

1。 這麼說不確切。Tomcat/Jetty 等等這一類叫Web Container,也就是Web容器,所謂容器,是和他負責的東西管理整個的生命周期的。所以Web Container會管理整個Servlet的生命周期。類似的Spring 的Ioc容器則會管理整個Bean的生命周期。而GlassFish/Weblogic這一類的 application Server,則會管理更多,包含命名伺服器,EJB等資源。

2。 Nginx/apache 可以說是web server. 也就是他們可以處理靜態資源,比如html,圖片等,但如果把Servlet交給它則處理不了。所以,一般把Nginx放在前端處理靜態資源,如果有對應的Servlet請求,則通過AJP轉給後面的Tomcat、Jetty進行處理。


tomcat是小姐,nginx是媽媽桑,appache+jk也可以起到媽媽桑的作用。到現在還在糾結到底要不要發個請求給這個集群


tomcat是servlet容器,另外2個不是。大家都已經說了。我說說我工作中nginx和apache的主要作用有哪些,之前沒有留意的小夥伴可以參考一下。

1 鑒權

主要是http鑒權(basic模式),數據來源是ldap。http鑒權有basic和digest(摘要)鑒權,我只見過basic鑒權的,建議每個人都去了解一下協議和如何配置,其實也相當簡單,花不了多少時間。

知識點:http鑒權(basic模式),LDAP

PS:tomcat也可以配置http鑒權。

2. 負載均衡

常規用處,沒啥好說,找文檔配置一下就知道。

3. 處理靜態文件

最常規的功能。靜態文件直接處理(一般加上緩存頭),其他轉給tomcat,用ajp協議(apache專用協議,nginx也有,但沒有在ng上用過ajp轉發)。

知識點:ajp協議,頁面緩存相關知識

4 反向代理

重要的功能,現在用得越來越多了。用於做請求分發,解決ajax跨域調用。

知識點:ajax跨域

5 頁面緩存

包括給靜態文件返回緩存相關的頭,和配置緩存模塊。這是2個不同東西。

知識點:瀏覽器如何緩存資源

當然他們實際上的功能還有很多,工作中實際用到的就這些,供初學者參考。


Tomcat 與 Nginx,Apache的區別

一、定義:

1. Apache

Apache HTTP伺服器是一個模塊化的伺服器,可以運行在幾乎所有廣泛使用的計算機平台上。其屬於應用伺服器。Apache支持支持模塊多,性能穩定,Apache本身是靜態解析,適合靜態HTML、圖片等,但可以通過擴展腳本、模塊等支持動態頁面等。

(Apche可以支持PHPcgiperl,但是要使用Java的話,你需要Tomcat在Apache後台支撐,將Java請求由Apache轉發給Tomcat處理。)

缺點:配置相對複雜,自身不支持動態頁面。

2. Tomcat:

Tomcat是應用(Java)伺服器,它只是一個Servlet(JSP也翻譯成Servlet)容器,可以認為是Apache的擴展,但是可以獨立於Apache運行。

3. Nginx

Nginx是俄羅斯人編寫的十分輕量級的HTTP伺服器,Nginx,它的發音為「engine X」,是一個高性能的HTTP和反向代理伺服器,同時也是一個IMAP/POP3/SMTP 代理伺服器。

二、比較

1. Apache與Tomcat的比較

相同點:

兩者都是Apache組織開發的

兩者都有HTTP服務的功能

兩者都是免費的

不同點:

Apache是專門用了提供HTTP服務的,以及相關配置的(例如虛擬主機、URL轉發等等),而Tomcat是Apache組織在符合Java EE的JSP、Servlet標準下開發的一個JSP伺服器。

Apache是一個Web伺服器環境程序,啟用他可以作為Web伺服器使用,不過只支持靜態網頁如(ASP,PHP,CGI,JSP)等動態網頁的就不行。如果要在Apache環境下運行JSP的話就需要一個解釋器來執行JSP網頁,而這個JSP解釋器就是Tomcat。

Apache:側重於HTTPServer ,Tomcat:側重於Servlet引擎,如果以Standalone方式運行,功能上與Apache等效,支持JSP,但對靜態網頁不太理想;

Apache是Web伺服器,Tomcat是應用(Java)伺服器,它只是一個Servlet(JSP也翻譯成Servlet)容器,可以認為是Apache的擴展,但是可以獨立於Apache運行。

實際使用中Apache與Tomcat常常是整合使用:

如果客戶端請求的是靜態頁面,則只需要Apache伺服器響應請求。

如果客戶端請求動態頁面,則是Tomcat伺服器響應請求。

因為JSP是伺服器端解釋代碼的,這樣整合就可以減少Tomcat的服務開銷。

可以理解Tomcat為Apache的一種擴展。

2. Nginx與Apache比較

1) nginx相對於apache的優點

輕量級,同樣起web 服務,比apache佔用更少的內存及資源

抗並發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高並發下nginx 能保持低資源低消耗高性能

高度模塊化的設計,編寫模塊相對簡單

提供負載均衡

社區活躍,各種高性能模塊出品迅速

2) apache 相對於nginx 的優點

apache的 rewrite 比nginx 的強大;

支持動態頁面;

支持的模塊多,基本涵蓋所有應用;

性能穩定,而nginx相對bug較多。

3)兩者優缺點比較

Nginx 配置簡潔, Apache 複雜;

Nginx 靜態處理性能比 Apache 高 3倍以上;

Apache 對 PHP 支持比較簡單,Nginx 需要配合其他後端用;

Apache 的組件比 Nginx 多;

apache是同步多進程模型,一個連接對應一個進程;nginx是非同步的,多個連接(萬級別)可以對應一個進程;

nginx處理靜態文件好,耗費內存少;

動態請求由apache去做,nginx只適合靜態和反向;

Nginx適合做前端伺服器,負載性能很好;

Nginx本身就是一個反向代理伺服器 ,且支持負載均衡

3.總結

Nginx優點:負載均衡、反向代理、處理靜態文件優勢。nginx處理靜態請求的速度高於apache;

Apache優點:相對於Tomcat伺服器來說處理靜態文件是它的優勢,速度快。Apache是靜態解析,適合靜態HTML、圖片等。

Tomcat:動態解析容器,處理動態請求,是編譯JSPServlet的容器,Nginx有動態分離機制,靜態請求直接就可以通過Nginx處理,動態請求才轉發請求到後台交由Tomcat進行處理。

Apache在處理動態有優勢,Nginx並發性比較好,CPU內存佔用低,如果rewrite頻繁,那還是Apache較適合。

反向代理的理解:

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器,

並將從伺服器上得到的結果返回給internet上請求連接的客戶端,此時代理伺服器對外就表現為一個伺服器。


相同:它們都是web server。

不同:apache/nignx是靜態伺服器,tomcat是動態伺服器。

歷史:apache是當年主流伺服器,但不思進取,後來被俄羅斯的更加輕便的nignx趕上。

證畢。


web服務 和其他rpc後台服務挺有意思的區別是: 監聽埠的那個http服務基本不主動生產什麼數據(當然多數web服務也能支持生產靜態文件數據,html類型還支持#include這種語法來包含別的子頁面片。),而是在分層架構上由另外的一層服務去負責生產數據。

而對於這一層服務是什麼,這些web伺服器就各有不同了。

tomcat是類似熱載入的HttpServlet。

nginx apache IIS 是CGI,FASTCGI,SCGI。

主要的區別就是他們和http服務之間的通信方法(前者是進程內沙箱通信,後者是進程間通信)和通信格式(前者是java對象,後者是標準輸入輸出和環境變數)吧。


"tomcat用在java後台程序上,java後台程序難道不能用apache和nginx嗎?"

不能。apache和nginx不是servlet容器。

什麼是servlet容器呢?即實現HttpServletRequest、HttpServletResponse、HttpSession等等介面,解析http請求,通過類載入器載入對應的servlet實現類並調用。

也就是說servlet容器必須由java或者基於jvm的語言實現。


就這麼理解吧,不去理會那麼多的概念

都是提供 web服務的,一般 web伺服器都使用 nginx 搭建,響應客戶端(瀏覽器)的請求,但是隨著web的發展,動態的web服務需要來了,而nginx沒有這種功能特性,所以這部分動態數據請求 需要外包第三方來做, 而tomcat ,jboss 這種java容器可以處理這種問題 ,所以就有了這些組合

另外 目前 openresty 正在做全功能的web伺服器,目的是把所有的數據請求,在nginx這一層解決掉,可以看看


補充點信息,剛才在《Node.js實戰》里看到的。


這三者都是web server,那他們各自有什麼特點呢?他們之間的區別是什麼呢?

nginx 和 tomcat在性能上面有何異同。

從功能上它們都可以成為httpserver,但tomcat一般不會直接承接流量,這不是它的功用,也不擅長這件事,tomcat在請求流向中的地位可以類比php-fpm。

在tomcat之前用來承接流量的選擇就非常多,nginx,apache,lighttd等等

對比nginx和apache的話,首先要明確apache的版本和mpm模式

prefork模式下的apache,要和nginx比拼吞吐量,簡直是搬起石頭砸自己的腳,這個模式下的目的就不是為了高吞吐。

通過配置說明,再從源碼中搜索配置欄位,可以從代碼片段中看到,在這個模式下apache每秒都會檢查一下當前開闢的進程數是不是合適,不合適的話進行調整,而且調整的步進幅度是1,2,4,8..,逐級增加,最大到32,這種策略也決定了突發的流量抖動,都會造成進程開闢速度跟不上。

#ifndef MAX_SPAWN_RATE
#define MAX_SPAWN_RATE (32)
#endif

...

if (hold_off_on_exponential_spawning) {
--hold_off_on_exponential_spawning;
}
else if (idle_spawn_rate &< MAX_SPAWN_RATE) { idle_spawn_rate *= 2; }

但是prefork模式下的穩定性也是從設計上就值得信賴,請求之間不會產生任何影響,最差的情況也就是我自己的進程掛了。

worker模式下的apache,無非是每個進程下開闢了不少線程去處理,性能上有所提成,但是穩定性上有所下降。

真正要和nginx比較的應該apache2.4下的event模式,至少在linux下有了和epoll類似的io復用機制(nginx在linux下使用的機制)。

Apache HTTP Server Version 2.4

This new architecture, leveraging non-blocking sockets and modern kernel features exposed by APR (like Linux"s epoll)

搜索標題apache event vs nginx,可以看到很多性能測試,目前為止看到的大部分性能測試好像還是nginx領先一點,尤其在靜態資源的處理上。

而lighttpd也是一個高吞吐的webserver,用法也和nginx類似,但貌似社區比較冷淡,資料也相對較少,從近期看到的benchmark上,已經被nginx超越了。

然後在動態內容的生成上,tomcat感覺就是為java而生的,nginx和apache當然還需要一些模塊或者對後端反向代理解決。就以我個人更熟悉的php為例吧,apache一貫就有mod_php支持,進程中即可解析php,省去了cgi調用的開銷,而nginx多配合php-fpm或者直接使用fcgi,稍微可以節約開銷的地方就是,當同機部署時,nginx反向代理php的sock,代替ip+port,可以省去一層tcp的消耗,不過這是理論上的,實際情況相差無幾。nginx其實目前也有類似mod_php的實現,叫ngx_php_module,但使用習慣上不希望nginx承擔的工作這麼重。

tomcat用在java後台程序上,java後台程序難道不能用apache和nginx嗎?

用apache或nginx做你的tomcat的經紀人唄。php,py也一般不會自己起好埠出去接客是吧。


三者都能處理基於http協議的請求。

apache http server只能處理靜態資源請求,就是放在伺服器上現成的一個個文件

nginx比apache多了反向代理和負載均衡的功能

tomcat比起apache還多了處理動態資源請求的功能,所謂的動態資源處理就是(也只支持)由java程序去執行判斷返回給client什麼資源。

不過雖然都支持處理靜態資源請求,不是說tomcat比apache還多了功能、就直接把apache否定了,他們的側重點是不同的,側重點就是他們各自的優勢不一樣。

具體怎麼不一樣,我也不是專家,說錯了誤導人,自己百度吧。


首先要分清楚WEB伺服器和應用伺服器。

WEB伺服器就是可以解析HTTP協議的,你要訪問一些圖片和一些文本信息都可以使用WEB伺服器來搞定。

應用伺服器就比較廣泛了,從字面上來說,就是把寫好的程序丟到應用伺服器里執行,比如Java,常用的有tomcat,jetty、這些是為Java應用程序提供運行時環境的,一些動態頁面,比如jsp它就必須在應用伺服器里才能解析。

所以,我們常常拿Java來開發後台應用程序,但是,大多數的要提供HTTP訪問介面,一個站點,圖片、js文件和css文件是少不了的,這些都是資源,要放在你的站點裡面才能訪問。

這些資源就不需要放到應用伺服器里了,太浪費資源了,直接丟到WEB伺服器里就可以了。這是WEB伺服器Apache和Nginx比較擅長的。

總之,在稍微大一點的項目里,前端都會架設web伺服器,然後由web伺服器將請求轉發給應用伺服器,比如tomcat和jetty等。


先看看app server和web server的區別 有助於理解


我最近學JAVA的xml dom就試了不用tomcat,

通過apache的cgi,

用shell調用JAVA,

JAVA用xml dom生成靜態html然後輸出,

效果還是可以的,html層次結構完全可以搞出來,

post數據也可以收到,

感覺該http server有的都能支持,


推薦閱讀:

並發的HTTP請求,apache是如何響應的,以及如何調用php文件的?
用 HHvm 運行 WordPress 是用 Apache 好還是 Nginx 好一點?
Web 測試 有沒有比Apache Jemeter更好的工具,windows或者macos上的?

TAG:Java | Nginx | Apache | ApacheTomcat | JavaWeb |