1. 程式人生 > >Java 爬蟲伺服器被遮蔽,不要慌,咱們換一臺伺服器

Java 爬蟲伺服器被遮蔽,不要慌,咱們換一臺伺服器

這是 Java 爬蟲系列博文的第四篇,在上一篇 Java 爬蟲遇上資料非同步載入,試試這兩種辦法! 中,我們從內建瀏覽器核心和反向解析法兩個角度簡單的聊了聊關於處理資料非同步載入問題。在這篇文章中,我們簡單的來聊一聊爬蟲時,資源網站根據使用者訪問行為遮蔽掉爬蟲程式及其對應的解決辦法。

遮蔽爬蟲程式是資源網站的一種保護措施,最常用的反爬蟲策略應該是基於使用者的訪問行為。比如限制每臺伺服器在一定的時間內只能訪問 X 次,超過該次數就認為這是爬蟲程式進行的訪問,基於使用者訪問行為判斷是否是爬蟲程式也不止是根據訪問次數,還會根據每次請求的User Agent 請求頭、每次訪問的間隔時間等。總的來說是由多個因數決定的,其中以訪問次數為主。

反爬蟲是每個資源網站自保的措施,旨在保護資源不被爬蟲程式佔用。例如我們前面使用到的豆瓣網,它會根據使用者訪問行為來遮蔽掉爬蟲程式,每個 IP 在每分鐘訪問次數達到一定次數後,後面一段時間內的請求返回直接返回 403 錯誤,以為著你沒有許可權訪問該頁面。所以我們今天再次拿豆瓣網為例,我們用程式模擬出這個現象,下面是我編寫的一個採集豆瓣電影的程式

/**
 * 採集豆瓣電影
 */
public class CrawlerMovie {

    public static void main(String[] args) {
        try {
            CrawlerMovie crawlerMovie = new CrawlerMovie();
            // 豆瓣電影連結
            List<String> movies = crawlerMovie.movieList();
            //建立10個執行緒的執行緒池
            ExecutorService exec = Executors.newFixedThreadPool(10);
            for (String url : movies) {
                //執行執行緒
                exec.execute(new CrawlMovieThread(url));
            }
            //執行緒關閉
            exec.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 豆瓣電影列表連結
     * 採用反向解析法
     *
     * @return
     */
    public List<String> movieList() throws Exception {
        // 獲取100條電影連結
        String url = "https://movie.douban.com/j/search_subjects?type=movie&tag=熱門&sort=recommend&page_limit=200&page_start=0";
        CloseableHttpClient client = HttpClients.createDefault();
        List<String> movies = new ArrayList<>(100);
        try {
            HttpGet httpGet = new HttpGet(url);
            CloseableHttpResponse response = client.execute(httpGet);
            System.out.println("獲取豆瓣電影列表,返回驗證碼:" + response.getStatusLine().getStatusCode());
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                String body = EntityUtils.toString(entity, "utf-8");
                // 將請求結果格式化成json
                JSONObject jsonObject = JSON.parseObject(body);
                JSONArray data = jsonObject.getJSONArray("subjects");
                for (int i = 0; i < data.size(); i++) {
                    JSONObject movie = data.getJSONObject(i);
                    movies.add(movie.getString("url"));
                }
            }
            response.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
        return movies;
    }
}
/**
 * 採集豆瓣電影執行緒
 */
class CrawlMovieThread extends Thread {
    // 待採集連結
    String url;

    public CrawlMovieThread(String url) {
        this.url = url;
    }
    public void run() {
        try {
            Connection connection = Jsoup.connect(url)
                    .method(Connection.Method.GET)
                    .timeout(50000);
            Connection.Response Response = connection.execute();
            System.out.println("採集豆瓣電影,返回狀態碼:" + Response.statusCode());
        } catch (Exception e) {
            System.out.println("採集豆瓣電影,採集出異常:" + e.getMessage());
        }
    }
}

這段程式的邏輯比較簡單,先採集到豆瓣熱門電影,這裡使用直接訪問 Ajax 獲取豆瓣熱門電影的連結,然後解析出電影的詳情頁連結,多執行緒訪問詳情頁連結,因為只有在多執行緒的情況下才能達到豆瓣的訪問要求。豆瓣熱門電影頁面如下:

多次執行上面的程式,你最後會得到下圖的結果

從上圖中我們可以看出,httpclient 訪問返回的狀態碼為 403 ,說明我們已經沒有許可權訪問該頁面了,也就是說豆瓣網已經認為我們是爬蟲程式啦,拒接掉了我們的訪問請求。我們來分析一下我們現在的訪問架構,因為我們是直接訪問豆瓣網的,所以此時的訪問架構如下圖所示:

我們想要突破這層限制的話,我們就不能直接訪問豆瓣網的伺服器,我們需要拉入第三方,讓別人代替我們去訪問,我們每次訪問都找不同的人,這樣就不會被限制了,這個也就是所謂的 IP代理。 此時的訪問架構就變成了下面這張圖:

我們使用的 IP代理,我們就需要有 IP代理池,接下來我們就來聊一聊 IP 代理池

IP 代理池

代理伺服器有很多廠商在做這一塊,具體的我就不說了,自己百度 IP 代理可以搜出一大堆,這些 IP代理商都有提供收費和免費的代理 IP,收費的代理 IP可用性高,速度快,在線上環境如果需要使用代理的話,建議使用收費的代理 IP。如果只是自己研究的話,我們就可以去採集這些廠商的免費公開代理 IP,這些 IP 的效能和可用性都比較差,但是不影響我們使用。

因為我們是 Demo 專案,所以我們就自己搭建 IP代理池。我們該怎麼設計一個 IP代理池呢?下圖是我畫的簡單 IP代理池架構圖

從上面的架構圖中,可以看出一個 IP 代理系統會涉及到 4 個模組,分別為 IP 採集模組、 IP 儲存模組、IP 檢測模組和 API 介面模組。

  • IP 採集模組

    負責從各大 IP代理廠商採集代理 IP,採集的網站越多,代理 IP 的可用性就越高

  • IP 儲存模組

    儲存採集回來的代理 IP,比較常用的是 Redis 這樣的高效能的資料庫,在儲存方面我們需要儲存兩種資料,一種是檢測可用的代理 IP,另一種是採集回來還未檢測的代理 IP。

  • IP 檢測模組

    檢測採集回來的 IP 是否可用,這樣能夠讓我們提供的 IP 可用性變高,我們先過濾掉不可用的 IP。

  • API 介面模組

    以介面的形式對外提供可用代理 IP

上面就是關於 IP代理池的相關設計,對於這些我們只需要簡單瞭解一下就行了,因為現在基本上不需要我們去編寫 IP代理池服務啦,在 GitHub 上已經有大量優秀的開源專案,沒必要重複造輪子啦。我為大家選取了在 GitHub 上有 8K star 的開源 IP代理池專案 proxy_pool ,我們將使用它作為我們 IP 代理池。關於 proxy_pool 請訪問:https://github.com/jhao104/proxy_pool

部署 proxy_pool

proxy_pool 是用 python 語言寫的,不過這也沒什麼關係,因為現在都可以容器化部署,使用容器化部署可以遮蔽掉一些環境的安裝,只需要執行映象就可以執行服務了,並不需要知道它裡面的具體實現,所以這個專案不懂 Python 的 Java 程式設計師也是可以使用的。proxy_pool 使用的是 Redis 來儲存採集的 IP,所以在啟動 proxy_pool 前,你需要先啟動 Redis 服務。下面是 proxy_pool docker啟動步驟。

  • 拉取映象

    docker pull jhao104/proxy_pool

  • 執行映象

    docker run --env db_type=REDIS --env db_host=127.0.0.1 --env db_port=6379 --env db_password=pwd_str -p 5010:5010 jhao104/proxy_pool

    執行映象後,我們等待一段時間,因為第一次啟動採集資料和處理資料需要一段時間。等待之後訪問 http://{your_host}:5010/get_all/,如果你得到下圖所示的結果,說明 proxy_pool 專案你已經部署成功。

使用 IP 代理

搭建好 IP代理池之後,我們就可以使用代理 IP 來採集豆瓣電影啦,我們已經知道了除了 IP 之外,User Agent 請求頭也會是豆瓣網判斷訪問是否是爬蟲程式的一個因素,所以我們也對 User Agent 請求頭進行偽造,我們每次訪問使用不同的 User Agent 請求頭。

我們為豆瓣電影採集程式引入 IP代理和 隨機 User Agent 請求頭,具體程式碼如下:

public class CrawlerMovieProxy {

    /**
     * 常用 user agent 列表
     */
    static List<String> USER_AGENT = new ArrayList<String>(10) {
        {
            add("Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19");
            add("Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");
            add("Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1");
            add("Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0");
            add("Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0");
            add("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36");
            add("Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19");
            add("Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3");
            add("Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3");
        }
    };

    /**
     * 隨機獲取 user agent
     *
     * @return
     */
    public String randomUserAgent() {
        Random random = new Random();
        int num = random.nextInt(USER_AGENT.size());
        return USER_AGENT.get(num);
    }

    /**
     * 設定代理ip池
     *
     * @param queue 佇列
     * @throws IOException
     */
    public void proxyIpPool(LinkedBlockingQueue<String> queue) throws IOException {


        // 每次能隨機獲取一個代理ip
        String proxyUrl = "http://192.168.99.100:5010/get_all/";

        CloseableHttpClient httpclient = HttpClients.createDefault();

        HttpGet httpGet = new HttpGet(proxyUrl);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        if (response.getStatusLine().getStatusCode() == 200) {
            HttpEntity entity = response.getEntity();
            String body = EntityUtils.toString(entity, "utf-8");

            JSONArray jsonArray = JSON.parseArray(body);
            int size = Math.min(100, jsonArray.size());
            for (int i = 0; i < size; i++) {
                // 將請求結果格式化成json
                JSONObject data = jsonArray.getJSONObject(i);
                String proxy = data.getString("proxy");
                queue.add(proxy);
            }
        }
        response.close();
        httpclient.close();
        return;
    }


    /**
     * 隨機獲取一個代理ip
     *
     * @return
     * @throws IOException
     */
    public String randomProxyIp() throws IOException {

        // 每次能隨機獲取一個代理ip
        String proxyUrl = "http://192.168.99.100:5010/get/";

        String proxy = "";

        CloseableHttpClient httpclient = HttpClients.createDefault();

        HttpGet httpGet = new HttpGet(proxyUrl);
        CloseableHttpResponse response = httpclient.execute(httpGet);
        if (response.getStatusLine().getStatusCode() == 200) {
            HttpEntity entity = response.getEntity();
            String body = EntityUtils.toString(entity, "utf-8");
            // 將請求結果格式化成json
            JSONObject data = JSON.parseObject(body);
            proxy = data.getString("proxy");
        }
        return proxy;
    }

    /**
     * 豆瓣電影連結列表
     *
     * @return
     */
    public List<String> movieList(LinkedBlockingQueue<String> queue) {
        // 獲取60條電影連結
        String url = "https://movie.douban.com/j/search_subjects?type=movie&tag=熱門&sort=recommend&page_limit=40&page_start=0";
        List<String> movies = new ArrayList<>(40);
        try {
            CloseableHttpClient client = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(url);
            // 設定 ip 代理
            HttpHost proxy = null;
            // 隨機獲取一個代理IP
            String proxy_ip = randomProxyIp();
            if (StringUtils.isNotBlank(proxy_ip)) {
                String[] proxyList = proxy_ip.split(":");
                System.out.println(proxyList[0]);
                proxy = new HttpHost(proxyList[0], Integer.parseInt(proxyList[1]));
            }
            // 隨機獲取一個請求頭
            httpGet.setHeader("User-Agent", randomUserAgent());
            RequestConfig requestConfig = RequestConfig.custom()
                    .setProxy(proxy)
                    .setConnectTimeout(10000)
                    .setSocketTimeout(10000)
                    .setConnectionRequestTimeout(3000)
                    .build();
            httpGet.setConfig(requestConfig);
            CloseableHttpResponse response = client.execute(httpGet);
            System.out.println("獲取豆瓣電影列表,返回驗證碼:" + response.getStatusLine().getStatusCode());
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                String body = EntityUtils.toString(entity, "utf-8");
                // 將請求結果格式化成json
                JSONObject jsonObject = JSON.parseObject(body);
                JSONArray data = jsonObject.getJSONArray("subjects");
                for (int i = 0; i < data.size(); i++) {
                    JSONObject movie = data.getJSONObject(i);
                    movies.add(movie.getString("url"));
                }
            }
            response.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
        return movies;
    }


    public static void main(String[] args) {
        // 存放代理ip的佇列
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue(100);

        try {
            CrawlerMovieProxy crawlerProxy = new CrawlerMovieProxy();
            // 初始化ip代理佇列
            crawlerProxy.proxyIpPool(queue);
            // 獲取豆瓣電影列表
            List<String> movies = crawlerProxy.movieList(queue);

            //建立固定大小的執行緒池
            ExecutorService exec = Executors.newFixedThreadPool(5);
            for (String url : movies) {
                //執行執行緒
                exec.execute(new CrawlMovieProxyThread(url, queue, crawlerProxy));
            }
            //執行緒關閉
            exec.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/**
 * 採集豆瓣電影執行緒
 */
class CrawlMovieProxyThread extends Thread {
    // 待採集連結
    String url;
    // 代理ip佇列
    LinkedBlockingQueue<String> queue;
    // 代理類
    CrawlerMovieProxy crawlerProxy;

    public CrawlMovieProxyThread(String url, LinkedBlockingQueue<String> queue, CrawlerMovieProxy crawlerProxy) {
        this.url = url;
        this.queue = queue;
        this.crawlerProxy = crawlerProxy;
    }

    public void run() {
        String proxy;
        String[] proxys = new String[2];
        try {
            Connection connection = Jsoup.connect(url)
                    .method(Connection.Method.GET)
                    .timeout(50000);

            // 如果代理ip佇列為空,則重新獲取ip代理
            if (queue.size() == 0) crawlerProxy.proxyIpPool(queue);
            // 從佇列中獲取代理ip
            proxy = queue.poll();
            // 解析代理ip
            proxys = proxy.split(":");
            // 設定代理ip
            connection.proxy(proxys[0], Integer.parseInt(proxys[1]));
            // 設定 user agent
            connection.header("User-Agent", crawlerProxy.randomUserAgent());
            Connection.Response Response = connection.execute();
            System.out.println("採集豆瓣電影,返回狀態碼:" + Response.statusCode() + " ,請求ip:" + proxys[0]);
        } catch (Exception e) {
            System.out.println("採集豆瓣電影,採集出異常:" + e.getMessage() + " ,請求ip:" + proxys[0]);
        }
    }
}

執行修改後的採集程式,可能需要多次執行,因為你的代理 IP 不一定每次都有效。代理 IP 有效的話,你將得到如下結果

結果中我們可以看出,40 次的電影詳情頁訪問,有大量的代理 IP 是無效的,只有一小部分的代理 IP 有效。結果直接證明了免費的代理 IP 可用性不高,所以如果線上需要使用代理 IP 的話,最好使用收費的代理 IP。儘管我們自己搭建的 IP代理池可用性不是太高,但是我們設定的 IP 代理訪問豆瓣電影已經成功了,使用 IP 代理成功繞過了豆瓣網的限制。

關於爬蟲伺服器被遮蔽,原因有很多,我們這篇文章主要介紹的是通過 設定 IP 代理和偽造 User Agent 請求頭來繞過豆瓣網的訪問限制。如何讓我們的程式不被資源網站視為爬蟲程式呢?需要做好以下三點:

  • 偽造 User Agent 請求頭
  • 使用 IP 代理
  • 不固定的採集間隔時間

希望這篇文章對你有所幫助,下一篇是關於多執行緒爬蟲的探索。如果你對爬蟲感興趣,不妨關注一波,相互學習,相互進步

文章不足之處,望大家多多指點,共同學習,共同進步

最後

打個小廣告,歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,一起進步吧。

相關推薦

Java 爬蟲伺服器遮蔽不要咱們伺服器

這是 Java 爬蟲系列博文的第四篇,在上一篇 Java 爬蟲遇上資料非同步載入,試試這兩種辦法! 中,我們從內建瀏覽器核心和反向解析法兩個角度簡單的聊了聊關於處理資料非同步載入問題。在這篇文章中,我們簡單的來聊一聊爬蟲時,資源網站根據使用者訪問行為遮蔽掉爬蟲程式及其對應的解決辦法。 遮蔽爬蟲程式是資源網站的

Linux-定時指令碼將伺服器上的mysql資料庫自動備份到另伺服器的資料庫中

有兩臺伺服器,一臺正式伺服器A,一臺測試伺服器B,現需要將正式伺服器A中的資料庫每天備份到測試伺服器B,提高資料庫的容災性以及防止資料庫在測試中出現錯誤。1.從正式伺服器A中匯出需要備份的資料庫使用mysqldump指令匯出資料庫檔案/usr/sbin/mysqldump -

斷網不要掌握這兩條命令分鐘就可以定位網絡問題

自動 filter dns trace ping type 解決 height upload 對於局域網而言,斷網基本上都是災難性的,領導、同事立刻唉聲占道、催個不停。作為一名網絡管理人員,不可避免經常會碰到斷網的情況。保持冷靜的頭腦,迅速的定位問題所在,可以說是一個網管必

資深老程式設計師前來指導:新手程式設計師遇到BUG不要教你幾招解決問題

公司新來的新手程式設計師,最近已經開始了他們的工作,部門的專案經理,為了讓他們快速上手,讓他們對之前的系統進行BUG修復工作,我認為,這種思路對新手程式設計師來說,是很有益的,通過查詢解決BUG,來熟悉業務和程式碼邏輯和結構,是比較快的上手方式,今天跟大家討論下處理BUG的方

操作失誤不要這個命令給你的Git次反悔的機會

今天我們來介紹git當中兩個非常非常好用的工具,git show和reflog。 這兩個命令雖然不是必知必會,但是如果熟練使用可以極大地幫助我們檢視程式碼倉庫的問題,以及在我們操作失誤的時候拯救我們。可以理解成應急技能,一般情況下用不到,關鍵時候會的話可以救命的那種。 git show 首先來聊聊git sh

lnmp環境下伺服器配置裡個專案介面訪問時返回資料但header頭status code=500

公司一個軟體專案微信客戶端本人開發用了thinkphp3,一個api配合客戶端app使用用了thinkphp5,兩個不可合二為一,只能在一臺伺服器上配置一個客戶端入口,一個api入口。 第一步:伺服器建立平行的兩個目錄,分別放上面兩個框架的程式碼; 第二步:nginx配置訪問入口,在/etc

linux環境下連線另伺服器的oracle資料庫常見問題詳解

一臺伺服器177 一臺伺服器,有oracle的12 177能ping通12 177不能telnet 12 1521埠 通過xShell隧道在windows能連上12的oracle資料庫 12的1521埠是開啟的。 我總結為是 1.防火牆 有沒有設定1521

如何理解伺服器可以繫結多個ip一個ip可以繫結多個域名

一個域名只能對應一個IP的意思是域名在DNS伺服器裡做解析的時候 一條記錄只能指向一個IP地址。這個是死規定,試想一下,如果一個子域名指向了2個ip ,當訪問者開啟這個域名的時候,瀏覽器是展示哪個IP上的網站呢?一個IP可以對於多個域名的意思是:一個IP繫結到一臺伺服器的時候,在伺服器上可以設定多個主機頭,每

linux下centos中nginx配置伺服器多個tomcat多個域名

1.直接貼程式碼自己看 下面是nginx 的nginx.conf檔案配置 一臺伺服器 三個tomcat 埠分別為:8080,7070,7072 三個域名:maijiaxiu.com;console.maijiaxiu.com; test.maijiaxiu.com #user n

通過Nginx反向代理伺服器上配置兩個域名

如果想在一臺伺服器上配置兩個域名,可以採用部署兩個Tomcat,分別繫結不同的埠,然後通過Nginx做反向代理,將兩個域名分別指向兩個Tomcat上。從而實現在一臺伺服器上配置兩個域名,或者多個域名的功能。配置方法如下:首先,通過配置Tomcat的server.xml,讓to

伺服器多個WEB應用SESSION衝突的解決方法

最近在客戶機器上部署系統,由於一臺伺服器上需要部署多個專案,而我們的WEB專案因為用到框架都是一樣的,導致同時執行,session相互衝突,這個登入後,那個就得重新登入,造成了使用不方便,我們的解決辦法如下: 對於tomcat7,可以這樣: 在server.xml檔案,ho

]利用shell指令碼crontabscp實現將伺服器的目錄備份到另伺服器

 關於scp的詳細功能可參考: 在這我以將伺服器A上的/home/proto目錄下的wordpress自動備份到 伺服器B的/home/proto/目錄下,其中proto為伺服器的使用者名稱, 在B下輸入命令 會發現要輸入A伺服器密碼,下面我們就解決輸入密碼

Linux部署WEB專案伺服器部署兩個Tomcat和兩個專案

      首先安裝JDK+Tomcat和配置好環境變數,部署第一個專案是比較簡單,本文主要是針對部署第二個專案的時候出現的一些問題和解決辦法進行敘述。可能解決辦法有很多種,目的都是為了解決遇到的問題。我們公司一直以來採用的是Nginx+Tomcat進行專案部署。  第一個專

SQL Server 2005資料庫同步到另伺服器(實時限區域網)

準備工作 1.        二臺電腦同一網段。 2.        二臺電腦口令一至 3.        啟動二臺伺服器的命名管道服務如下圖 4.        登入資料庫伺服器時都必須選擇命名管道如下圖 選項 選擇命名管道,確定 新建釋出(在釋出伺服器上

伺服器安裝兩個不同的phpapache版本環境?

1、首先需要重啟,path路徑只能寫一個php路徑。另外關鍵一處就是環境變數中 PHPRC 這個值。這個值比較關鍵,如果不改也會導致切換php版本失敗。注意切換版本後一定要重啟。可以用cmd,php-v 檢視版本是否更改過來,然後看是否有哪些模組沒有載入。

SpringCloud Quartz-Cluster 微服務採用註解配置 Quartz 分散式叢集一直伺服器執行

一、大致介紹 1、因網友提到有沒有采用註解式配置的Quartz例子,因此本人就貼上了這樣一個樣例; 2、至於如何修改定時任務的 cronExpression 表示式值的話,大家可以參照之前的(第 010 篇)樣子看看如何修改; 3、注意:配置檔案中的 mysql 資料庫連結

伺服器通過netstat -an命令看到大量狀態SYN_RCVD的連線可能發生的原因是什麼?

主要有兩種可能: 1.對方(請求方或客戶端)沒有收到伺服器傳送的[SYN,ACK]包(一般是由於網路結構或安全規則限制導致(SYN,ACK)包無法傳送到對方)。 2.對方收到了[SYN,ACK]包卻沒有ACK。 這種情況分兩種可能,一是對方程式有意這麼做,如

【097】Nginx實現伺服器兩個域名釋出不同的前端專案並且兩個域名都用80埠。

有時候你可能需要在一個伺服器上,用 nginx 釋出兩個前端專案。並且這兩個前端專案使用不同的域名,域名都繫結80埠。本文說明此場景下的操作過程。Nginx使用的是 Docker 官方映象。本文依據的作業系統是 Linux Centos7.3 。 假設 you

當陷入人為困境時不要抱怨只能默默地吸取教訓

一、iptables入門      當今黑客入侵電腦有很多種途徑,其中通過埠進行入侵比較普遍。特別是作為伺服器的計算機,關閉不必要的埠,這是最簡單的也是最常用的防禦黑入侵的做法。用Linux作為伺服器作業系統,使用Linux自帶的iptables可以實現這功能。    1、

mongodb 快速複製資料到 另外伺服器

源伺服器 192.168.1.100   27017 目標伺服器 192.168.1.100   27018   源伺服器  目標伺服器  配置成 主從模式 ,就可以實現無需(匯出 匯入 資料)