怎么在Nginx中實(shí)現(xiàn)反向代理并支持長(zhǎng)連接?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)企業(yè)建站,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過(guò)對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。前言
Nginx upstream與后端的連接默認(rèn)為短連接,通過(guò)HTTP/1.0向后端發(fā)起連接,并把請(qǐng)求的"Connection" header設(shè)為"close"。Nginx與前端的連接默認(rèn)為長(zhǎng)連接,一個(gè)用戶跟Nginx建立連接之后,通過(guò)這個(gè)長(zhǎng)連接發(fā)送多個(gè)請(qǐng)求。如果Nginx只是作為reverse proxy的話,可能一個(gè)用戶連接就需要多個(gè)向后端的短連接。如果后端的服務(wù)器(源站或是緩存服務(wù)器)處理并發(fā)連接能力不強(qiáng)的話,就可能導(dǎo)致瓶頸的出現(xiàn)。
Nginx目前的upstream連接建立和獲取的機(jī)制如下圖。Nginx會(huì)在一開(kāi)始創(chuàng)建connection pool(進(jìn)程間不共享,可以避免鎖),提供給所有向前/后的連接。
如果要實(shí)現(xiàn)upstream長(zhǎng)連接,則每個(gè)進(jìn)程需要另外一個(gè)connection pool,里面都是長(zhǎng)連接。一旦與后端服務(wù)器建立連接,則在當(dāng)前請(qǐng)求連接結(jié)束之后不會(huì)立即關(guān)閉連接,而是把用完的連接保存在一個(gè)keepalive connection pool里面,以后每次需要建立向后連接的時(shí)候,只需要從這個(gè)連接池里面找,如果找到合適的連接的話,就可以直接來(lái)用這個(gè)連接,不需要重新創(chuàng)建socket或者發(fā)起connect()。這樣既省下建立連接時(shí)三次握手的時(shí)間消耗,又可以避免TCP連接的slow start。如果在keepalive連接池找不到合適的連接,那就按照原來(lái)的步驟重新建立連接。假設(shè)連接查找時(shí)間可以忽略不計(jì),那么這種方法肯定是有益而無(wú)害的(當(dāng)然,需要少量額外的內(nèi)存)。
具體如何來(lái)設(shè)計(jì)這個(gè)keepalive connection pool,不同人有不同的選擇。比如Nginx目前的第三方模塊upstream keepalive(作者M(jìn)axim Dounin)使用了一個(gè)queue來(lái)做。因?yàn)閡pstream的服務(wù)器很可能是多個(gè),所以可能當(dāng)保持的連接數(shù)多的時(shí)候,查找的時(shí)間可能會(huì)較長(zhǎng)。可以給每個(gè)upstream服務(wù)器都分配一個(gè)pool(queue),縮短查找時(shí)間。但是總體來(lái)說(shuō)內(nèi)存操作很快,影響不會(huì)很大。upstream keepalive模塊目前只支持memcached,但是可以重用其代碼來(lái)達(dá)到對(duì)http upstream的長(zhǎng)連接。由于Nginx作者之前沒(méi)有考慮upstream的長(zhǎng)連接,所以在設(shè)計(jì)上要把http upstream keepalive模塊化可能比較難,只能通過(guò)手動(dòng)修改代碼來(lái)做到。
一個(gè)完整的讓upstream支持長(zhǎng)連接的配置示例如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
|
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。