Nginx實作長連線應用

WBOY
發布: 2016-08-08 09:31:45
原創
1660 人瀏覽過

無論大家做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
登入後複製
5、重啟ngnix,造訪http://你的IP:/activity?id =你的Channel ,如果瀏覽器一直等待,

然後,你寫一段程式碼去發布一條訊息,如果瀏覽器能接受到,表示安裝成功!


  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; 
}
登入後複製
6、以上都安裝完畢後,就開始我們自己的邏輯了



下面是監聽端,這裡做了一個簡單的實現,我們需要在監聽端始終記錄一個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教程有興趣的朋友有所幫助。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板