無論大家做web後端還是app後端,還是SOA服務化,長連線都是一個不錯的選擇,一方面節省了每次都建立連線的資源消耗,另一方面,可以讓訊息及時的回應,提升了體驗。
這裡介紹一種透過Nginx module實現長連接的辦法,這種方式是http協定上的長連接,嚴格上講http協定本身就是請求應答式的,並沒有嚴格意義的長連接,所謂的長連接是指沒有對應的時候,可以一直hold,一直到有對應為止,然後立刻再重新建立一次連線。
下面來講一下如何來實現的。
1、先下載NGiNX_HTTP_Push_Module和Nginx,就這兩個tar檔;
2、將這兩個tarterrr個、c33、nginx有可能會出現找不到pcre模組等,如果你是Centos系統,使用yum -y install pcre-devel openssl openssl-devel來安裝
安裝後,繼續執行nginx的安裝
4、等nginx都安裝完畢之後,設定長連線:
在/use/local/nginx/conf的nginx.conf檔
./configure --add-module=path/to/nginx_http_push_module ... make make install
然後,你寫一段程式碼去發布一條訊息,如果瀏覽器能接受到,表示安裝成功!
location /publish { set $push_channel_id $arg_id; push_publisher; push_store_messages on; push_message_timeout 2h; push_max_message_buffer_length 10; } location /activity { push_subscriber; set $push_channel_id $arg_id; push_subscriber_concurrency broadcast; default_type text/plain; }
下面是監聽端,這裡做了一個簡單的實現,我們需要在監聽端始終記錄一個lastModified,這個時間代表了他最後接受到的新訊息的時間
public void testNginx(){ String http = "http://172.16.4.108/publish?id=my"; PostMethod postMethod = new PostMethod(http); RequestEntity requestEntity = new StringRequestEntity("444"); postMethod.setRequestEntity(requestEntity); try{ int status =this.client.executeMethod(postMethod); if (status == HttpStatus.SC_OK) { String text = postMethod.getResponseBodyAsString(); System.out.println(text); } }catch (Exception e){ e.printStackTrace(); } }
private static String etag = ""; private static String lastModified = ""; public static void main(String[] args){ while (true) { HttpClient httpClient = new HttpClient(); String http = "http://172.16.4.108/activity?id=my"; GetMethod getMethod = new GetMethod(http); getMethod.setRequestHeader("Connection","keep-alive"); getMethod.setRequestHeader("If-None-Match", etag); getMethod.setRequestHeader("If-Modified-Since", lastModified); try { int status = httpClient.executeMethod(getMethod); if(getMethod.getResponseHeader("Etag") != null) { etag = getMethod.getResponseHeader("Etag").getValue(); } if(getMethod.getResponseHeader("Last-Modified") != null) { lastModified = getMethod.getResponseHeader("Last-Modified").getValue(); } System.out.println("etag=" + etag + ";lastmodif=" + lastModified + ";status=" + status); if (status == HttpStatus.SC_OK) { String text = getMethod.getResponseBodyAsString(); System.out.println(text); } } catch (Exception e) { e.printStackTrace(); } } }
以上就介紹了Nginx實現長連結應用,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。