訪問者模式應用場景
❶ 設計模式都有哪些
總體來說設計模式分為三大類:
一、創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
二、結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
三、行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
1、工廠方法模式:
定義一個用於創建對象的介面,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
工廠模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,這就用到工廠方法模式。
創建一個工廠介面和創建多個工廠實現類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。
2、抽象工廠模式:
提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。抽象工廠需要創建一些列產品,著重點在於"創建哪些"產品上,也就是說,如果你開發,你的主要任務是劃分不同差異的產品線,並且盡量保持每條產品線介面一致,從而可以從同一個抽象工廠繼承。
3、單例模式:
單例對象(Singleton)是一種常用的設計模式。在java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。這樣的模式有幾個好處:
(1)某些類創建比較頻繁,對於一些大型的對象,這是一筆很大的系統開銷。
(2)省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力。
(3)有些類如交易所的核心交易引擎,控制著交易流程,如果該類可以創建多個的話,系統完全亂了。(比如一個軍隊出現了多個司令員同時指揮,肯定會亂成一團),所以只有使用單例模式,才能保證核心交易伺服器獨立控制整個流程。
4、建造者模式:
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
5、原型模式:
原型模式雖然是創建型的模式,但是與工程模式沒有關系,從名字即可看出,該模式的思想就是將一個對象作為原型,對其進行復制、克隆,產生一個和原對象類似的新對象。本小結會通過對象的復制,進行講解。在Java中,復制對象是通過clone()實現的,先創建一個原型類。
6、適配器模式:
適配器模式將某個類的介面轉換成客戶端期望的另一個介面表示,目的是消除由於介面不匹配所造成的類的兼容性問題。主要分為三類:類的適配器模式、對象的適配器模式、介面的適配器模式。
7、裝飾器模式:
顧名思義,裝飾模式就是給一個對象增加一些新的功能,而且是動態的,要求裝飾對象和被裝飾對象實現同一個介面,裝飾對象持有被裝飾對象的實例。
8、代理模式:
代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什麼呢?因為你對該地區房屋的信息掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思。
9、外觀模式:
外觀模式是為了解決類與類之家的依賴關系的,像spring一樣,可以將類和類之間的關系配置到配置文件中,而外觀模式就是將他們的關系放在一個Facade類中,降低了類類之間的耦合度,該模式中沒有涉及到介面。
10、橋接模式:
橋接模式就是把事物和其具體實現分開,使他們可以各自獨立的變化。橋接的用意是:將抽象化與實現化解耦,使得二者可以獨立變化,像我們常用的JDBC橋DriverManager一樣。
JDBC進行連接資料庫的時候,在各個資料庫之間進行切換,基本不需要動太多的代碼,甚至絲毫不用動,原因就是JDBC提供統一介面,每個資料庫提供各自的實現,用一個叫做資料庫驅動的程序來橋接就行了。
11、組合模式:
組合模式有時又叫部分-整體模式在處理類似樹形結構的問題時比較方便。使用場景:將多個對象組合在一起進行操作,常用於表示樹形結構中,例如二叉樹,數等。
12、享元模式:
享元模式的主要目的是實現對象的共享,即共享池,當系統中對象多的時候可以減少內存的開銷,通常與工廠模式一起使用。
13、策略模式:
策略模式定義了一系列演算法,並將每個演算法封裝起來,使其可以相互替換,且演算法的變化不會影響到使用演算法的客戶。需要設計一個介面,為一系列實現類提供統一的方法,多個實現類實現該介面,設計一個抽象類(可有可無,屬於輔助類),提供輔助函數。
14、模板方法模式:
一個抽象類中,有一個主方法,再定義1...n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過調用抽象類,實現對子類的調用。
15、觀察者模式:
觀察者模式很好理解,類似於郵件訂閱和RSS訂閱,當我們瀏覽一些博客或wiki時,經常會看到RSS圖標,就這的意思是,當你訂閱了該文章,如果後續有更新,會及時通知你。
其實,簡單來講就一句話:當一個對象變化時,其它依賴該對象的對象都會收到通知,並且隨著變化!對象之間是一種一對多的關系。
16、迭代子模式:
顧名思義,迭代器模式就是順序訪問聚集中的對象,一般來說,集合中非常常見,如果對集合類比較熟悉的話,理解本模式會十分輕松。這句話包含兩層意思:一是需要遍歷的對象,即聚集對象,二是迭代器對象,用於對聚集對象進行遍歷訪問。
17、責任鏈模式:
責任鏈模式,有多個對象,每個對象持有對下一個對象的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一對象決定處理該請求。但是發出者並不清楚到底最終那個對象會處理該請求,所以,責任鏈模式可以實現,在隱瞞客戶端的情況下,對系統進行動態的調整。
18、命令模式:
命令模式的目的就是達到命令的發出者和執行者之間解耦,實現請求和執行分開。
19、備忘錄模式:
主要目的是保存一個對象的某個狀態,以便在適當的時候恢復對象,個人覺得叫備份模式更形象些,通俗的講下:假設有原始類A,A中有各種屬性,A可以決定需要備份的屬性,備忘錄類B是用來存儲A的一些內部狀態,類C呢,就是一個用來存儲備忘錄的,且只能存儲,不能修改等操作。
20、狀態模式:
狀態模式在日常開發中用的挺多的,尤其是做網站的時候,我們有時希望根據對象的某一屬性,區別開他們的一些功能,比如說簡單的許可權控制等。
21、訪問者模式:
訪問者模式把數據結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。訪問者模式適用於數據結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。
若系統數據結構對象易於變化,經常有新的數據對象增加進來,則不適合使用訪問者模式。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到一個訪問者對象中,其改變不影響系統數據結構。其缺點就是增加新的數據結構很困難。
22、中介者模式:
中介者模式也是用來降低類類之間的耦合的,因為如果類類之間有依賴關系的話,不利於功能的拓展和維護,因為只要修改一個對象,其它關聯的對象都得進行修改。
如果使用中介者模式,只需關心和Mediator類的關系,具體類類之間的關系及調度交給Mediator就行,這有點像spring容器的作用。
23、解釋器模式:
解釋器模式一般主要應用在OOP開發中的編譯器的開發中,所以適用面比較窄。
(1)訪問者模式應用場景擴展閱讀:
介紹三本關於設計模式的書:
1、《設計模式:可復用面向對象軟體的基礎》
作者:[美] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
出版社: 機械工業出版社
2、《軟體秘笈:設計模式那點事》
作者:鄭阿奇
出版社:電子工業出版社
3、《設計模式:基於C#的工程化實現及擴展》
作者:王翔
出版社:電子工業出版社
❷ 軟體設計原則有哪些
七大設計原則
開閉原則
依賴導倒置原則
單一職責原則
介面隔離原則
迪米特原則
里氏替換原則
合成復用原則
設計模式-創建型模式
工廠方法模式
抽象工廠模式
建造者模式
單例模式
原型模式
設計模式-結構性模式
適配器模式
裝飾者模式
代理模式
外觀模式
橋接模式
組合模式
享元模式
設計模式-行為型模式
策略模式
模板方法模式
觀察者模式
訪問者模式
迭代器模式
責任鏈模式
中介者模式
解釋器模式
狀態模式
命令模式
備忘錄模式
軟體設計原則介紹
所以,可以說軟體系統是連接需求分析、硬體系統以及使得系統實現的橋梁,對軟體的設計應首先了解軟體設計的設計原則。
設計原則
(1)可靠性
軟體系統的規模越做越大越加復雜,其可靠性越來越難保證。應用本身對系統運行的可靠性要求越來越高,軟體系統的可靠性也直接關繫到設計自身的聲譽和生存發展競爭能力。軟體可靠性意味著該軟體在測試運行過程中避免可能發生故障的能力,且一旦發生故障後,具有解脫和排除故障的能力。軟體可靠性和硬體可靠性本質區別在於:後者為物理機理的衰變和老化所致,而前者是由於設計和實現的錯誤所致。故軟體的可靠性必須在設計階段就確定,在生產和測試階段再考慮就困難了。
(2)健壯性
健壯性又稱魯棒性,是指軟體對於規范要求以外的輸入能夠判斷出這個輸入不符合規范要求,並能有合理的處理方式。軟體健壯性是一個比較模糊的概念,但是卻是非常重要的軟體外部量度標准。軟體設計的健壯與否直接反應了分析設計和編碼人員的水平。
(3)可修改性
要求以科學的方法設計軟體,使之有良好的結構和完備的文檔,系統性能易於調整。
(4)容易理解
軟體的可理解性是其可靠性和可修改性的前提。它並不僅僅是文檔清晰可讀的問題,更要求軟體本身具有簡單明了的結構。這在很大程度上取決於設計者的洞察力和創造性,以及對設計對象掌握得透徹程度,當然它還依賴於設計工具和方法的適當運用。
(5)程序簡便
(6)可測試性
可測試性就是設計一個適當的數據集合,用來測試所建立的系統,並保證系統得到全面的檢驗。
(7)效率性
軟體的效率性一般用程序的執行時間和所佔用的內存容量來度量。在達到原理要求功能指標的前提下,程序運行所需時間愈短和佔用存儲容量愈小,則效率愈高。
(8)標准化原則
在結構上實現開放,基於業界開放式標准,符合國家和信息產業部的規范。
(9)先進性
滿足客戶需求,系統性能可靠,易於維護。
(10)可擴展性
軟體設計完要留有升級介面和升級空間。對擴展開放,對修改關閉。
(11)安全性
安全性要求系統能夠保持用戶信息、操作等多方面的安全要求,同時系統本身也要能夠及時修復、處理各種安全漏洞,以提升安全性能。
❸ 深入分析Java Web技術內幕的圖書目錄
第1章 深入Web請求過程 1
1.1 B/S網路架構概述 2
1.2 如何發起一個請求 4
1.3 HTTP協議解析 6
1.3.1 查看HTTP信息的工具 8
1.3.2 瀏覽器緩存機制 9
1.4 DNS域名解析 12
1.4.1 DNS域名解析過程 12
1.4.2 跟蹤域名解析過程 15
1.4.3 清除緩存的域名 18
1.4.4 幾種域名解析方式 19
1.5 CDN工作機制 20
1.5.1 CDN架構 20
1.5.2 負載均衡 21
1.6 總結 24
第2章 深入分析Java I/O的工作機制 25
2.1 Java的I/O類庫的基本架構 25
2.1.1 基於位元組的I/O操作介面 26
2.1.2 基於字元的I/O操作介面 27
2.1.3 位元組與字元的轉化介面 28
2.2 磁碟I/O工作機制 29
2.2.1 幾種訪問文件的方式 29
2.2.2 Java訪問磁碟文件 33
2.2.3 Java序列化技術 34
2.3 網路I/O工作機制 36
2.3.1 TCP狀態轉化 37
2.3.2 影響網路傳輸的因素 39
2.3.3 Java Socket的工作機制 39
2.3.4 建立通信鏈路 40
2.3.5 數據傳輸 41
2.4 NIO的工作方式 41
2.4.1 BIO帶來的挑戰 41
2.4.2 NIO的工作機制 42
2.4.3 Buffer的工作方式 45
2.4.4 NIO的數據訪問方式 47
2.5 I/O調優 49
2.5.1 磁碟I/O優化 49
2.5.2 TCP網路參數調優 50
2.5.3 網路I/O優化 52
2.6 設計模式解析之適配器模式 56
2.6.1 適配器模式的結構 56
2.6.2 Java I/O中的適配器模式 57
2.7 設計模式解析之裝飾器模式 57
2.7.1 裝飾器模式的結構 58
2.7.2 Java I/O中的裝飾器模式 58
2.8 適配器模式與裝飾器模式的區別 59
2.9 總結 59
第3章 深入分析Java Web中的中文編碼問題 60
3.1 幾種常見的編碼格式 60
3.1.1 為什麼要編碼 60
3.1.2 如何「翻譯」 61
3.2 Java中需要編碼的場景 63
3.2.1 I/O操作中存在的編碼 63
3.2.2 內存操作中的編碼 65
3.3 Java中如何編解碼 66
3.3.1 按照ISO-8859-1編碼 68
3.3.2 按照GB2312編碼 69
3.3.3 按照GBK編碼 70
3.3.4 按照UTF-16編碼 70
3.3.5 按照UTF-8編碼 71
3.3.6 UTF-8編碼代碼片段 71
3.3.7 幾種編碼格式的比較 73
3.4 Java Web中涉及的編解碼 73
3.4.1 URL的編解碼 75
3.4.2 HTTP Header的編解碼 78
3.4.3 POST表單的編解碼 78
3.4.4 HTTP BODY的編解碼 79
3.5 JS中的編碼問題 80
3.5.1 外部引入JS文件 80
3.5.2 JS的URL編碼 81
3.5.3 其他需要編碼的地方 83
3.6 常見問題分析 83
3.6.1 中文變成了看不懂的字元 83
3.6.2 一個漢字變成一個問號 84
3.6.3 一個漢字變成兩個問號 84
3.6.4 一種不正常的正確編碼 85
3.7 總結 86
第4章 Javac編譯原理 87
4.1 Javac是什麼 88
4.2 Javac編譯器的基本結構 88
4.3 Javac工作原理分析 90
4.3.1 詞法分析器 91
4.3.2 語法分析器 98
4.3.3 語義分析器 103
4.3.4 代碼生成器 113
4.4 設計模式解析之訪問者模式 116
4.4.1 訪問者模式的結構 117
4.4.2 Javac中訪問者模式的實現 118
4.5 總結 119
第5章 深入class文件結構 120
5.1 JVM指令集簡介 120
5.1.1 類相關的指令 122
5.1.2 方法的定義 123
5.1.3 屬性的定義 124
5.1.4 其他指令集 125
5.2 class文件頭的表示形式 133
5.3 常量池 137
5.3.1 UTF8常量類型 140
5.3.2 Fieldref、Methodref常量類型 141
5.3.3 Class常量類型 141
5.3.4 NameAndType常量類型 142
5.4 類信息 142
5.5 Fields和Methods定義 143
5.6 類屬性描述 147
5.7 Javap生成的class文件結構 148
5.7.1 LineNumberTable 150
5.7.2 LocalVariableTable 151
5.8 總結 153
第6章 深入分析ClassLoader 工作機制 154
6.1 ClassLoader類結構分析 155
6.2 ClassLoader的等級載入機制 156
6.3 如何載入class文件 159
6.3.1 載入位元組碼到內存 159
6.3.2 驗證與解析 161
6.3.3 初始化Class對象 161
6.4 常見載入類錯誤分析 161
6.4.1 ClassNotFoundException 161
6.4.2 NoClassDefFoundError 162
6.4.3 UnsatisfiedLinkError 163
6.4.4 ClassCastException 164
6.4.5 ExceptionInInitializerError 165
6.5 常用的ClassLoader分析 166
6.6 如何實現自己的ClassLoader 170
6.6.1 載入自定義路徑下的class文件 170
6.6.2 載入自定義格式的class文件 172
6.7 實現類的熱部署 174
6.8 Java應不應該動態載入類 176
6.9 總結 177
第7章 JVM體系結構與工作方式 178
7.1 JVM體系結構 178
7.1.1 何謂JVM 178
7.1.2 JVM體系結構詳解 181
7.2 JVM工作機制 183
7.2.1 機器如何執行代碼 183
7.2.2 JVM為何選擇基於棧的架構 184
7.2.3 執行引擎的架構設計 185
7.2.4 執行引擎的執行過程 186
7.2.5 JVM方法調用棧 191
7.3 總結 195
第8章 JVM內存管理 196
8.1 物理內存與虛擬內存 197
8.2 內核空間與用戶空間 198
8.3 Java中哪些組件需要使用內存 199
8.3.1 Java堆 199
8.3.2 線程 199
8.3.3 類和類載入器 200
8.3.4 NIO 200
8.3.5 JNI 201
8.4 JVM內存結構 201
8.4.1 PC寄存器 202
8.4.2 Java棧 202
8.4.3 堆 203
8.4.4 方法區 203
8.4.5 運行時常量池 204
8.4.6 本地方法棧 204
8.5 JVM內存分配策略 204
8.5.1 通常的內存分配策略 205
8.5.2 Java中內存分配詳解 205
8.6 JVM內存回收策略 210
8.6.1 靜態內存分配和回收 210
8.6.2 動態內存分配和回收 211
8.6.3 如何檢測垃圾 211
8.6.4 基於分代的垃圾收集演算法 213
8.7 內存問題分析 222
8.7.1 GC日誌分析 222
8.7.2 堆快照文件分析 225
8.7.3 JVM Crash日誌分析 225
8.8 實例1 231
8.9 實例2 233
8.10 實例3 235
8.11 總結 240
第9章 Servlet工作原理解析 241
9.1 從Servlet容器說起 241
9.1.1 Servlet容器的啟動過程 242
9.1.2 Web應用的初始化工作 245
9.2 創建Servlet實例 247
9.2.1 創建Servlet對象 248
9.2.2 初始化Servlet 248
9.3 Servlet體系結構 250
9.4 Servlet如何工作 253
9.5 Servlet中的Listener 255
9.6 Filter如何工作 257
9.7 Servlet中的url-pattern 259
9.8 總結 260
第10章 深入理解Session與Cookie 261
10.1 理解Cookie 262
10.1.1 Cookie屬性項 262
10.1.2 Cookie如何工作 263
10.1.3 使用Cookie的限制 266
10.2 理解Session 267
10.2.1 Session與Cookie 267
10.2.2 Session如何工作 268
10.3 Cookie安全問題 271
10.4 分布式Session框架 272
10.4.1 存在哪些問題 272
10.4.2 可以解決哪些問題 273
10.4.3 總體實現思路 273
10.5 Cookie壓縮 278
10.6 表單重復提交問題 280
10.7 總結 281
第11章 Tomcat的系統架構與 設計模式 282
11.1 Tomcat總體設計 282
11.1.1 Tomcat總體結構 283
11.1.2 Connector組件 289
11.1.3 Servlet容器Container 294
11.1.4 Tomcat中的其他組件 305
11.2 Tomcat中的設計模式 305
11.2.1 門面設計模式 305
11.2.2 觀察者設計模式 307
11.2.3 命令設計模式 309
11.2.4 責任鏈設計模式 310
11.3 總結 312
第12章 Jetty的工作原理解析 313
12.1 Jetty的基本架構 313
12.1.1 Jetty的基本架構簡介 313
12.1.2 Handler的體系結構 315
12.2 Jetty的啟動過程 316
12.3 接受請求 317
12.3.1 基於HTTP協議工作 317
12.3.2 基於AJP工作 319
12.3.3 基於NIO方式工作 322
12.4 處理請求 323
12.5 與Jboss集成 326
12.6 與Tomcat的比較 327
12.6.1 架構比較 327
12.6.2 性能比較 328
12.6.3 特性比較 328
12.7 總結 329
第13章 Spring框架的設計理念與 設計模式分析 330
13.1 Spring的骨骼架構 330
13.1.1 Spring的設計理念 331
13.1.2 核心組件如何協同工作 332
13.2 核心組件詳解 333
13.2.1 Bean組件 333
13.2.2 Context組件 335
13.2.3 Core組件 336
13.2.4 Ioc容器如何工作 338
13.3 Spring中AOP特性詳解 348
13.3.1 動態代理的實現原理 348
13.3.2 Spring AOP如何實現 351
13.4 設計模式解析之代理模式 354
13.4.1 代理模式原理 354
13.4.2 Spring中代理模式的實現 354
13.5 設計模式解析之策略模式 357
13.5.1 策略模式原理 357
13.5.2 Spring中策略模式的實現 358
13.6 總結 358
第14章 Spring MVC工作機制與 設計模式 360
14.1 Spring MVC的總體設計 360
14.2 Control設計 365
14.2.1 HandlerMapping初始化 366
14.2.2 HandlerAdapter初始化 368
14.2.3 Control的調用邏輯 369
14.3 Model設計 370
14.4 View設計 371
14.5 框架設計的思考 373
14.5.1 為什麼需要框架 373
14.5.2 需要什麼樣的框架 373
14.5.3 框架設計的原則 374
14.5.4 「指航燈」 374
14.5.5 最基本的原則 374
14.6 設計模式解析之模板模式 375
14.6.1 模板模式的結構 375
14.6.2 Spring MVC中的模板模式示例 376
14.7 總結 377
第15章 深入分析Ibatis框架之系統 架構與映射原理 378
15.1 Ibatis框架主要的類層次結構 378
15.2 Ibatis框架的設計策略 379
15.3 Ibatis框架的運行原理 381
15.4 示例 383
15.5 Ibatis對SQL語句的解析 385
15.6 資料庫欄位映射到Java對象 386
15.7 示例運行的結果 388
15.8 設計模式解析之簡單工廠模式 388
15.8.1 簡單工廠模式的實現原理 388
15.8.2 Ibatis中的簡單工廠模式示例 389
15.9 設計模式解析之工廠模式 390
15.9.1 工廠模式的實現原理 390
15.9.2 Ibatis中的工廠模式示例 391
15.10 總結 392
第16章 Velocity工作原理解析 394
16.1 Velocity總體架構 395
16.2 JJTree渲染過程解析 398
16.2.1 #set語法 402
16.2.2 Velocity的方法調用 403
16.2.3 #if、#elseif和#else語法 406
16.2.4 #foreach語法 407
16.2.5 #parse語法 409
16.3 事件處理機制 410
16.4 常用優化技巧 413
16.4.1 減少樹的總節點數量 413
16.4.2 減少渲染耗時的節點數量 413
16.5 與JSP比較 414
16.5.1 JSP渲染機制 414
16.5.2 Velocity與JSP 420
16.6 設計模式解析之合成模式 420
16.6.1 合成模式的結構 420
16.6.2 Velocity中合成模式的實現 421
16.7 設計模式解析之解釋器模式 422
16.7.1 解釋器模式的結構 422
16.7.2 Velocity中解釋器模式的實現 423
16.8 總結 423
第17章 Velocity優化實踐 424
17.1 現實存在的問題 424
17.2 優化的理論基礎 425
17.2.1 程序語言的三角形結構 425
17.2.2 數據結構減少抽象化 426
17.2.3 簡單的程序復雜化 426
17.2.4 減少翻譯的代價 427
17.2.5 變的轉化為不變 427
17.3 一個高效的模板引擎的實現思路 427
17.3.1 vm模板如何被編譯 429
17.3.2 方法調用的無反射優化 436
17.3.3 字元輸出改成位元組輸出 439
17.4 優化的成果 440
17.4.1 char轉成byte 440
17.4.2 無反射執行 441
17.5 其他優化手段 442
17.6 總結 442
❹ apache-httpd的三種模式
apache httpd-2.4
新增模塊;
mod_proxy_fcgi(可提供 fcgi 代理)
mod_ratelimit(限制用戶帶寬)
mod_request(請求模塊,對請求做過濾)
mod_remoteip(匹配客戶端的 IP 地址)
對於基於 IP 的訪問控製做了修改,不再支持 allow,deny,order 機制,而是統一使用 require進行
還新增以下幾條新特性;
1、MPM 支持在運行時裝載;不過要開啟這種特性,在編譯安裝要啟用這三種功能;
--enable-mpms-shared=all --with-mpm=event
2、支持 event
3、支持非同步讀寫
4、在每個模塊及每個目錄上指定日誌級別
5、增強版的表達式分析器
6、每請求配置:<If>, <Elseif>
7、毫秒級別的 keepalive timeout
8、基於 FQDN 的虛擬主機不再需要 NameVirtualHost 指令
9、支持使用自定義變數
安裝時HTTPd 可以添加許多模塊
相關模塊解析:
--enable-so:支持動態共享模塊(即打開 DSO 支持)
--enable-rewrite:支持 url 重寫
--enable-ssl:支持 ssl
--with-ssl=/usr/local/openssl:指定 ssl 安裝位置
--enable-cgi:啟用 cgi
--enable-cgid:MPM 使用的是 event 或 worker 要啟用 cgid
--enable-moles=most:明確指明要靜態編譯到 httpd 二進制文件的模塊,<MODULE-LIST>為
空格分隔的模塊名列表、all 或者 most,all 表示包含所有模塊,most 表示包含大部分常用模
塊
--enable-mpms-shared=all:啟用 MPM 所有支持的模式,這樣 event、worker、prefork 就會以
模塊化的方式安裝,要用哪個就在 httpd.conf 里配置就好了。
--with-mpm=event:指定啟用的 mpm 模式,默認使用 enevt 模式,在 apache 的早期版本 2.0
默認 prefork,2.2 版本是 worker,2.4 版本是 event.
--with-pcre=/usr/local/pcre:支持 pcre
--with-z=/usr/local/zlib:使用 zlib 壓縮庫
--with-apr=/usr/local/apr:指定 apr 的安裝路徑
--with-apr-util=/usr/local/apr-util:指定 apr-util 的安裝路徑
--enable-expires:激活彧通過配置文件控制 HTTP 的「Expires:」和「Cache-Control:」頭內容,即
對網站圖片、js、css 等內容,提供客戶端瀏覽器緩存的設置。這個是 apache 調優的一個重
要選項之一。
--enable-deflate:提供對內容的壓縮傳輸編碼支持,一般是 html、js、css 等內容的站點。使
用此參數會打打提高傳輸速度,提升訪問者訪問的體驗。在生產環境中,這是 apache 調優
的一個重要選項之一。
Apache 的優化配置:
apache 所運行的硬體環境都是對性能影響最大的因素,即使不能對硬體進行升級,也最好
給 apache 一個單獨的主機以免受到其他應用的干擾。各個硬體指標中,對性能影響最大的
是內存,對於靜態內容(圖片、javascript 文件、css 文件等),它決定了 apache 可以緩存多
少內容,它緩存的內容越多,在硬碟上讀取內容的機會就越少,大內存可以極大提高靜態站
點的速度;對動態高負載站點來說,每個請求保存的時間更多一些,apache 的 mpm 模塊會
為每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正
比,因此增大內存對提高動態站點的負載和運行速度也極為有利
其次是硬碟的速度,靜態站點尤為突出,apache 不斷的在讀取文件並發送給相應的請求,
硬碟的讀寫是極其頻繁的;動態站點也要不斷的載入 web 程序(php 等),一個請求甚至要讀
取十幾個文件才能處理完成,因此盡可能的提高硬碟速度和質量對提高 apache 的性能是有
積極意義的。
最後是 cpu 和網路,cpu 影響的是 web 程序執行速度,網路影響流量大小。
apache 的工作模式:
Apache HTTP 伺服器被設計為一個強大的、靈活的能夠在多種平台以及不同環境下工作的服
務器。這種模塊化的設計就叫做「多進程處理模塊」(Multi-Processing Mole,MPM),也叫
做工作模式。
Prefork 模式(一個非線程型的):
其主要工作方式是:當 Apache 伺服器啟動後,mpm_prefork 模塊會預先創建多個子進程(默
認為 5 個),每個子進程只有一個線程,當接收到客戶端的請求後,mpm_prefork 模塊再將
請求轉交給子進程處理,並且每個子進程同時只能用於處理單個請求。如果當前的請求數將
超過預先創建的子進程數時,mpm_prefork 模塊就會創建新的子進程來處理額外的請求。
Apache 總是試圖保持一些備用的或者是空閑的子進程用於迎接即將到來的請求。這樣客戶
端的請求就不需要在接收後等候子進程的產生。
由於在 mpm_prefork 模塊中,每個請求對應一個子進程,因此其佔用的系統資源相對其他
兩種模塊而言較多。不過 mpm_prefork 模塊的優點在於它的每個子進程都會獨立處理對應
的單個請求,這樣,如果其中一個請求出現問題就不會影響到其他請求。Prefork 在效率上
要比 Worker 要高,但是內存使用大得多不擅長處理高並發的場景。
Apache 在 prefork 工作模式下影響性能的重要參數說明
# prefork MPM
<IfMole mpm_prefork_mole>
StartServers 5
#apache 啟動時候默認開始的子進程數
MinSpareServers 5
#最小的閑置子進程數
MaxSpareServers 10
#最大的閑置子進程數
MaxRequestWorkers 250
#MaxRequestWorkers 設 置 了 允 許 同 時 的 最 大 接 入 請 求 數 量 。 任 何 超 過MaxRequestWorkers 限制的請求將進入等候隊列,在 apache2.3.1 以前的版本
MaxRequestWorkers 被稱為 MaxClients,舊的名字仍舊被支持。
MaxConnectionsPerChild 500
#設置的是每個子進程可處理的請求數。每個子進程在處理了「MaxConnectionsPerChild」
個請求後將自動銷毀。0 意味著無限,即子進程永不銷毀。雖然預設設為 0 可以使每個
子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的內
存泄漏。2、在伺服器負載下降的時侯會自動減少子進程數。因此,可根據伺服器的負
載來調整這個值。在 Apache2.3.9 之前稱之為 MaxRequestsPerChild。
</IfMole>
注 1:MaxRequestWorkers 是這些指令中最為重要的一個,設定的是 Apache 可以同時處理
的請求,是對 Apache 性能影響最大的參數。如果請求總數已達到這個值(可通過 ps -ef|grep
http|wc -l 來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源
還剩下很多而 HTTP 訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越
多,建議將初始值設為(以 Mb 為單位的最大物理內存/2),然後根據負載情況進行動態調整。
比如一台 4G 內存的機器,那麼初始值就是 4000/2=2000。
注 2:prefork 控制進程在最初建立「StartServers」個子進程後,為了滿足 MinSpareServers 設
置的需要創建一個進程,等待一秒鍾,繼續創建兩 個,再等待一秒鍾,繼續創建四個……如
此按指數級增加創建的進程數,最多達到每秒 32 個,直到滿足 MinSpareServers 設置的值為
止。這種模式 可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。
MaxSpareServers 設置了最大的空閑進程數,如果空閑進程數大於這個 值,Apache 會自動 kill
掉一些多餘進程。這個值不要設得過大,但如果設的值比 MinSpareServers 小,Apache 會自
動把其調整為 MinSpareServers+1。如果站點負載較大,可考慮同時加大 MinSpareServers 和
MaxSpareServers。
注 3:ServerLimit 和 MaxClients(MaxRequestWorkers)有什麼區別呢?
是因為在 apache1 時代,控制最大進程數只有 MaxClients 這個參數,並且這個參數最大值為
256,並且是寫死了的,試圖設置為超過 256 是無效的,這是由於 apache1 時代的伺服器硬
件限制的。但是 apache2 時代由於伺服器硬體的升級,硬體已經不再是限制,所以使用
ServerLimit 這個參數來控制最大進程數,ServerLimit 值>=MaxClient 值才有效。ServerLimit
要放在 MaxClients 之前,值要不小於 MaxClients。
注 4:查看 Apache 載入的模塊
[root@www ~]#apachectl -t -D DUMP_MODULES
或
[root@www ~]# apachectl -M
或
[root@www ~]# apachectl –l (小寫 L,只顯示靜態模塊)
如何查看 Apache 的工作模式呢?可以使用 httpd -V 命令查看,另外使用 httpd -l 也可以查
看到
注 5:如何修改 prefork 參數和啟用 prefork 模式
1.[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
2.[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
LoadMole mpm_prefork_mole moles/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf
3 重啟httpd
Worker 模式(多線程多進程):
和 prefork 模式相比,worker 使用了多進程和多線程的混合模式,worker 模式也同樣會先預
派生一些子進程,然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會
被分配到一個線程來服務。線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,
因此,內存的佔用會減少一些,在高並發的場景下會比 prefork 有更多可用的線程,表現會
更優秀一些;另外,如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是
多個線程出現問題,也只是影響 Apache 的一部分,而不是全部。由於用到多進程多線程,
需要考慮到線程的安全了,在使用 keep-alive 長連接的時候,某個線程會一直被佔用,即使
中間沒有請求,需要等待到超時才會被釋放(該問題在 prefork 模式下也存在)
總的來說,prefork 方式速度要稍高於 worker,然而它需要的 cpu 和 memory 資源也稍多於
woker。
Apache 在 worker 工作模式下影響性能的重要參數說明
# worker MPM
<IfMole mpm_worker_mole>
StartServers 3
#apache 啟動時候默認開始的子進程數
MinSpareThreads 75
#最小空閑數量的工作線程
MaxSpareThreads 250
#最大空閑數量的工作線程
ThreadsPerChild 25
#每個子進程產生的線程數量
MaxRequestWorkers 400
#與 prefork 模式相同
MaxConnectionsPerChild 0
#與 prefork 模式相同
</IfMole>
注 1:Worker 由主控制進程生成「StartServers」個子進程,每個子進程中包含固定的
ThreadsPerChild 線程數,各個線程獨立地處理請求。同樣, 為了不在請求到來時再生成線
程,MinSpareThreads 和 MaxSpareThreads 設置了最少和最多的空閑線程數;
而 MaxRequestWorkers 設置了同時連入的 clients 最大總數。如果現有子進程中的線程總數不
能滿足負載,控制進程將派生新的子進程
MinSpareThreads 和 MaxSpareThreads 的最大預設值分別是 75 和 250。這兩個參數對 Apache
的性能影響並不大,可以按照實際情況相應調節 。
注 2:ThreadsPerChild 是 worker MPM 中與性能相關最密切的指令。ThreadsPerChild 的最大
預設值是 64,如果負載較大,64 也是不夠的。這時要顯式使用 ThreadLimit 指令,它的最大
預設值是 20000。
注 3:Worker 模式下所能同時處理的請求總數是由子進程總數乘以 ThreadsPerChild 值決定
的,應該大於等於 MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制
進程會派生新的子進程。默認最大的子進程總數是 16,加大時 也需要顯式聲明 ServerLimit
(系統配置的最大進程數量,最大值是20000)。需要注意的是,如果顯式聲明了 ServerLimit,
那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers
必須是 ThreadsPerChild 的整數倍,否則 Apache 將會自動調節到一個相應值。
注 4:進程與線程的區別
線程是指進程內的一個執行單元,也是進程內的可調度實體.
與進程的區別:
(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程
有自己獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是.
(4)二者均可並發執行.
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對
應用的並發性。
進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的並發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程
序的運行效率。
Event 模式:
這是 Apache 最新的工作模式,是 worker 模式的變種,它把服務進程從連接中分離出來,一
worker 模式不同的是在於它解決了 keep-alive 長連接的時候佔用線程資源被浪費的問題,在
event 工作模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請
求過來的時候,將請求傳遞給伺服器的線程,執行完畢後,又允許它釋放。這增強了在高並
發場景下的請求處理。event 模式不能很好的支持 https 的訪問(HTTP 認證相關的問題)。