Web服務(wù)器與應(yīng)用服務(wù)器
什么是web服務(wù)器?
Web服務(wù)器一般指網(wǎng)站服務(wù)器,是指駐留于因特網(wǎng)上某種類型計(jì)算機(jī)的程序,可以向?yàn)g覽器等Web客戶端提供文檔,也可以放置網(wǎng)站文件,讓全世界瀏覽;可以放置數(shù)據(jù)文件,讓全世界下載。
什么是應(yīng)用服務(wù)器?
嚴(yán)格意義上Web服務(wù)器只負(fù)責(zé)處理HTTP協(xié)議,只能發(fā)送靜態(tài)頁(yè)面的內(nèi)容。而JSP,ASP,PHP等動(dòng)態(tài)內(nèi)容需要通過(guò)CGI、FastCGI、ISAPI等接口交給其他程序去處理。這個(gè)其他程序就是應(yīng)用服務(wù)器
二者之間的聯(lián)系?
在大多數(shù)時(shí)候,Web服務(wù)器和引用服務(wù)器這兩個(gè)術(shù)語(yǔ)是可以互換使用的
Web服務(wù)器的設(shè)計(jì)目的是提供HTTP內(nèi)容,應(yīng)用服務(wù)器也可以提供HTTP內(nèi)容,但不限于HTTP,它還可以提供其他協(xié)議支持,如RMI / RPC。
Web服務(wù)器主要是為提供靜態(tài)內(nèi)容而設(shè)計(jì)的,不過(guò)大多數(shù)Web服務(wù)器都有插件來(lái)支持腳本語(yǔ)言,比如Perl、PHP、ASP、JSP等,通過(guò)這些插件,這些服務(wù)器就可以生成動(dòng)態(tài)的HTTP內(nèi)容
ps:簡(jiǎn)單來(lái)說(shuō)前臺(tái)接待(web服務(wù)器) ,服務(wù)者(應(yīng)用服務(wù)器)。
常見(jiàn)的Web服務(wù)器
Apache
Apache是世界使用排名第一的Web服務(wù)器軟件。它可以運(yùn)行在幾乎所有廣泛使用的計(jì)算機(jī)平臺(tái)上。Apache源于NCSAhttpd服務(wù)器,經(jīng)過(guò)多次修改,成為世界上最流行的Web服務(wù)器軟件之一。Apache取自"a patchy server"的讀音,意思是充滿補(bǔ)丁的服務(wù)器,因?yàn)樗亲杂绍浖圆粩嘤腥藖?lái)為它開(kāi)發(fā)新的功能、新的特性、修改原來(lái)的缺陷。Apache的特點(diǎn)是簡(jiǎn)單、速度快、性能穩(wěn)定,并可做代理服務(wù)器來(lái)使用
Nginx
Nginx 是一個(gè)很強(qiáng)大的高性能Web和反向代理服務(wù),它具有很多非常優(yōu)越的特性:
Nginx 小巧占內(nèi)存少,在連接高并發(fā)的情況下,Nginx是Apache服務(wù)不錯(cuò)的替代品: 能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng) ,也就是單個(gè)nginx一瞬間可以同時(shí)處理50,000個(gè)請(qǐng)求。
IIS
IIS本人沒(méi)怎么接觸過(guò),它包括了Web服務(wù)器、FTP服務(wù)器、NNTP服務(wù)器和SMTP服務(wù)器,分別用于網(wǎng)頁(yè)瀏覽、文件傳輸、新聞服務(wù)和郵件發(fā)送等方面,它使得在網(wǎng)絡(luò)(包括互聯(lián)網(wǎng)和局域網(wǎng))上發(fā)布信息成了一件很容易的事。ps:桌面配置真的感覺(jué)超爽,配置錯(cuò)了或者沒(méi)有權(quán)限當(dāng)時(shí)就知道 不用再去翻日志查看 不得不說(shuō)微軟在用戶體驗(yàn)上下足了功夫。
以上為今年十月份web服務(wù)器使用排名。Apache依然是霸主地位,但是Nginx即將趕超
常見(jiàn)的應(yīng)用服務(wù)器
Apache tomcat
Tomcat是一個(gè)開(kāi)放源代碼、運(yùn)行Servlet和JSP的容器 Apache:側(cè)重于HTTPServer ,Tomcat:側(cè)重于Servlet引擎,特點(diǎn) 簡(jiǎn)單、速度快、性能穩(wěn)定
Eclipse Jetty
Jetty 一個(gè)比tomcat的架構(gòu)更為簡(jiǎn)單,更加小巧,更加快速的服務(wù)器。但是對(duì)于Servlet的兼容做的沒(méi)有Tomcat好,可以同時(shí)處理大量連接而且可以長(zhǎng)時(shí)間保持連接,適合于web聊天應(yīng)用等等。
Orcale WebLogic (收費(fèi)) (閉源)
Oracle大佬產(chǎn)的,這貨可牛逼,專為java設(shè)計(jì)的一個(gè)基于JAVAEE架構(gòu)的中間件,用于開(kāi)發(fā)、集成、部署和管理大型分布式Web應(yīng)用、網(wǎng)絡(luò)應(yīng)用和數(shù)據(jù)庫(kù)應(yīng)用的Java應(yīng)用服務(wù)器。將Java的動(dòng)態(tài)功能和安全性引入大型網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)、集成、部署和管理之中
RedHat Jboss
基于J2EE的應(yīng)用服務(wù)器,JBoss核心服務(wù)不包括支持servlet/JSP的WEB容器,一般與Tomcat綁定使用,JBoss的Web容器使用的是Tomcat
IBM WebSphere(收費(fèi))(閉源)
IBM大佬產(chǎn)的,WebSphere Application Server是用于J2EE企業(yè)應(yīng)用級(jí)運(yùn)行所需的WEB容器。一般用于保險(xiǎn),銀行等等核心交易系統(tǒng)
CAUCHO Resin
是一個(gè)非常流行的支持servlets和jsp的引擎,速度非常快。Resin本身包含了一個(gè)支持HTTP/1.1的WEB服務(wù)器。它不僅可以顯示動(dòng)態(tài)內(nèi)容,而且它顯示靜態(tài)內(nèi)容的能力也非常強(qiáng),速度直逼apache
LiteSpeed
可以替換Apache 使用較小的內(nèi)存處理更多的鏈接,ps:但是有得就有失 CPU的使用率怕是扛不住
Lighttpd
是一個(gè)德國(guó)人領(lǐng)導(dǎo)的開(kāi)源Web服務(wù)器軟件。
我們所使用的服務(wù)器
IIS+nginx+tomcat
IIS作為web服務(wù)器,nginx做代理服務(wù)器負(fù)責(zé)接受http/https請(qǐng)求下發(fā)給tomcat處理請(qǐng)求
為什么要用nginx
1.apache與tomcat的瓶頸,tomcat初始產(chǎn)生1000個(gè)線程,最大2000線程,每一個(gè)請(qǐng)求為一個(gè)線程也就是說(shuō)一個(gè)tomcat最多可以處理2000個(gè)請(qǐng)求,然而這只是靜態(tài)請(qǐng)求 而非動(dòng)態(tài)請(qǐng)求
使用loadrunner設(shè)置1000并發(fā)用戶數(shù)進(jìn)行壓力測(cè)試。
100人-----響應(yīng)時(shí)間0.8秒 完美
150人-----響應(yīng)時(shí)間1秒 完美
200人-----響應(yīng)時(shí)間1.5秒 響應(yīng)時(shí)間有微小波動(dòng) 比較完美
250人-----響應(yīng)時(shí)間1.8秒 比較完美(此時(shí)是理想情況下最大的并發(fā)用戶數(shù)量)
280人-----開(kāi)始出現(xiàn)連接丟失問(wèn)題,連接開(kāi)始不穩(wěn)定
300人-----響應(yīng)時(shí)間3秒 響應(yīng)時(shí)間有較大波動(dòng)峰值為6秒 較差
350人-----響應(yīng)時(shí)間3秒 開(kāi)始大量出現(xiàn)連接丟失問(wèn)題 連接很不穩(wěn)定
400人-----響應(yīng)時(shí)間3.8秒 連接丟失數(shù)量達(dá)到3000次以上
450人-----響應(yīng)時(shí)間4秒 連接丟失數(shù)量達(dá)到6000次以上
500人-----響應(yīng)時(shí)間4秒 連接丟失數(shù)量達(dá)到11000次以上
550人-----響應(yīng)時(shí)間6秒 連接丟失數(shù)量達(dá)到21000次以上
600人-----響應(yīng)時(shí)間6秒 連接丟失數(shù)量達(dá)到25000次以上
600人開(kāi)始系統(tǒng)出現(xiàn)異常情況,因此停止測(cè)試。測(cè)試數(shù)據(jù)到此為止。
微信截圖_20181130130728.png
在用戶超過(guò)350時(shí)性能會(huì)出現(xiàn)斷崖式的下滑 這就是它的瓶頸,所以我們需要用nginx做負(fù)載均衡,用兩個(gè)tomcat分?jǐn)倝毫Γ部梢宰黾悍謹(jǐn)倝毫Α?/p>
2.nginx 動(dòng)靜分離,即正向代理處理靜態(tài)資源,反向代理處理動(dòng)態(tài)資源。
3.nginx 壓縮機(jī)制,可以將過(guò)大的數(shù)據(jù)包或文件壓縮,根據(jù)壓縮級(jí)別壓縮文件的大小,級(jí)別越高壓縮越小,ps:cpu消耗也大
4.內(nèi)置的健康檢查功能:如果有一個(gè)服務(wù)器宕機(jī),會(huì)做一個(gè)健康檢查,再發(fā)送的請(qǐng)求就不會(huì)發(fā)送到宕機(jī)的服務(wù)器了。重新將請(qǐng)求提交到其他的節(jié)點(diǎn)上
5.接收用戶請(qǐng)求是異步的:瀏覽器將請(qǐng)求發(fā)送到nginx服務(wù)器,它先將用戶請(qǐng)求全部接收下來(lái),再一次性發(fā)送給后端web服務(wù)器,極大減輕了web服務(wù)器的壓力 一邊接收web服務(wù)器的返回?cái)?shù)據(jù),一邊發(fā)送給瀏覽器客戶端
Nginx配置
對(duì)于 nginx我們只需要知道配置文件在conf文件夾下就可以,其他不需要我們操心,除非你要增加模塊或自定義模塊
http {
include mime.types;#引用默認(rèn)文件
default_type application/octet-stream;#默認(rèn)配置
#日志輸出格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;#日志打印地址
sendfile on;#on/off 減少拷貝次數(shù),提升文件傳輸性能的方法
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;#線程存活時(shí)間65s
#gzip 壓縮
gzip on;
gzip_comp_level 4; #推薦先設(shè)置為中間的值,比如4或者5
gzip_proxied any; #off為關(guān)閉,any為壓縮所有后端服務(wù)器返回的數(shù)據(jù)。
gzip_types text/plain application/x-javascript text/css application/xml; #一般情況下如此設(shè)置
gzip_vary on; #默認(rèn)為off用于設(shè)置是否在使用gzip功能時(shí)發(fā)送帶有"vary:Accept-Encoding" 頭域的響應(yīng)頭部,該頭域的主要功能時(shí)要告訴客戶端數(shù)據(jù)已經(jīng)在服務(wù)器進(jìn)行了壓縮
upstream netitcast.com { #服務(wù)器集群名字
server 127.0.0.1:8081 weight=1;#服務(wù)器配置 weight是權(quán)重的意思,權(quán)重越大,分配的概率越大。
server 127.0.0.1:8080 weight=2;
}
server {
listen 443;#端口號(hào)
server_name api.carbybus.com;#域名
ssl on;#開(kāi)啟ssl
ssl_certificate 214950803920621.pem; #證書pem
ssl_certificate_key 214950803920621.key; #證書key
ssl_session_timeout 5m;#指定客戶端可以重用會(huì)話參數(shù)的時(shí)間(超時(shí)后不可使用)
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#重點(diǎn)來(lái)咯
location / {#所有https的請(qǐng)求都到這里
charset utf-8;
# netitcast.com下面的名字要與upsteam后面的名字保持一致
proxy_pass http://netitcast.com; # 反向代理的地址
proxy_redirect default; #代理默認(rèn)配置 以下是將請(qǐng)求的頭傳給tomcat
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {#通過(guò)80進(jìn)來(lái)的是http請(qǐng)求
listen 80;
server_name api.carbybus.com; # 你的域名
rewrite ^(.*)$ https://$host$1 permanent;# 把http的域名請(qǐng)求轉(zhuǎn)成https
}}
Tomcat配置
server.xml Tomcat配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 原8005端口 用于關(guān)閉tomcat ps:telnet 到8005端口然后執(zhí)行“SHUTDOWN”(區(qū)分大小寫),此時(shí)也可看到tomcat后臺(tái)在解析telnet上來(lái)的命令,然后果然tomcat被關(guān)閉了 -->
<Server port="8007" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<!--連接身份校驗(yàn) 登錄tomcat后臺(tái)時(shí)有用沒(méi)有后臺(tái)就沒(méi)用-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--端口8011 原8009 ,負(fù)責(zé)和其他的HTTP服務(wù)器建立連接。-->
<Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />
<!--HTTPS端口號(hào)為443 http端口號(hào)為80,負(fù)責(zé)建立HTTP連接。-->
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" URIEncoding="UTF-8"
SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
keystoreFile="/usr/service/apache-tomcat-8.5.35/conf/1564131_gps.carbybus.com.pfx" keystorePass="k7J7UwpP"
>
</Connector>
<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>
catalina.sh/catalina.bat 一個(gè)servlet容器
具體內(nèi)容我也看不懂~但是有些問(wèn)題是需要通過(guò)修改catalina來(lái)解決1.windows 下啟動(dòng)tomcat閃退問(wèn)題: 需要添加JAVA_HOME的地址解決
2.OutOfMemoryError: Java heap space (堆內(nèi)存溢出),
OutOfMemoryError: PermGen space(永久保存區(qū)域溢出),
OutOfMemoryError: unable to create new native thread(無(wú)法創(chuàng)建新的線程),
添加:JAVA_OPTS='-Xms512m -Xmx1024m'
或者 JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
或者 CATALINA_OPTS="-server -Xms256m -Xmx300m"解決
自己如何實(shí)現(xiàn)tomcat
package clc.dispath.netty.common;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @ProjectName: cicada
* @Package: clc.dispath.netty.common
* @ClassName: TestSErver
* @Description: java類作用描述
* @Author: 孫志成
* @CreateDate: 2018/11/30 10:20
* @UpdateUser: 更新者
* @UpdateDate: 2018/11/30 10:20
* @UpdateRemark: 更新說(shuō)明
* @Version: 1.0
*/
public class TestSErver {
public static void main(String[] args) throws IOException {
TestSErver testSErver=new TestSErver();
testSErver.start();
}
public void start() throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("啟動(dòng)web服務(wù)");
while (true) {
socket = serverSocket.accept();
Thread thread = new Thread(new HttpServerThread(socket));
thread.start();
}
}
// 內(nèi)部類
private class HttpServerThread implements Runnable {
Socket socket = null;
HttpServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
try {
is = this.socket.getInputStream();
os = this.socket.getOutputStream();
// 頁(yè)面的請(qǐng)求
br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
int i = 0;
while (null != line && br.ready()) {
line = br.readLine();
System.out.println("第" + i + "行信息:" + line);
i++;
}
// 頁(yè)面的響應(yīng)
String reply = "HTTP/1.1\n"; // 必須添加的響應(yīng)頭
reply += "Content-type:text/html\n\n"; // 必須添加的響應(yīng)頭
reply += "<h1>!@#!@#</h1>";
os.write(reply.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}