Nginx支持socket轉發


有個接口是通過socket通信,對端服務器訪問存在IP限制,只好通過跳板機,因為它具備訪問對端服務器的權限。nginx1.9開始支持tcp層的轉發,通過stream實現的,而socket也是基於tcp通信。

一.實現過程:

1.安裝nginx,stream模塊默認不安裝的,需要手動添加參數:–with-stream,官方下載地址:download,根據自己系統版本選擇nginx1.9或以上版本。

 

2.nginx.conf 配置,參考說明:ngx_stream_core_module

nginx.conf

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
.................
}

# tcp層轉發的配置文件夾

include /etc/nginx/tcp.d/*.conf;

請注意,stream配置不能放到http內,即不能放到/etc/nginx/conf.d/,因為stream是通過tcp層轉發,而不是http轉發。

如配置在http內,啟動nginx會報如下錯誤:

nginx: [emerg] "server" directive is not allowed here

 

3.在tcp.d下新建個bss_num_30001.conf文件,內容如下:

stream {
    # 添加socket轉發的代理
    upstream bss_num_socket {
        hash $remote_addr consistent;
        # 轉發的目的地址和端口
        server 130.51.11.33:19001 weight=5 max_fails=3 fail_timeout=30s;
    }

    # 提供轉發的服務,即訪問localhost:30001,會跳轉至代理bss_num_socket指定的轉發地址
    server {
       listen 30001;
       proxy_connect_timeout 1s;
       proxy_timeout 3s;
       proxy_pass bss_num_socket;
    }
}

 

4.重啟nginx,訪問localhost:30001,會跳轉到bss_num_socket指定的轉發地址130.51.11.33:19001。

 

二.報錯處理:
1.nginx: [emerg] unknown directive "stream " 

nginx沒有安裝stream模塊,configure時添加–with-stream

 

2./configure: error: the HTTP rewrite module requires the PCRE library

需要安裝pcre,直接下載源碼安裝,PCRE下載

 

3.configure: error: You need a C++ compiler for C++ support

安裝pcre時報錯,缺少c++編譯器,
redhat 運行命令

yum install -y gcc gcc-c++

ubuntu

sudo apt-get install build-essential

 

4.

Running rpm_check_debug 
Running Transaction Test

yum安裝C++時一直卡在這里,本機之前掛載了nfs,但是nfs服務器掛掉,所以一直卡着,把nfs注釋掉即可

#vim /etc/mtab

 

5.nginx error while loading shared libraries: libpcre.so.1:

nginx加載pcre時報錯了

[root@localhost sbin]# ldd $(which /usr/local/nginx/sbin/nginx)
	linux-vdso.so.1 =>  (0x00007ffd6ce6a000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00000033d9a00000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00000033da200000)
	libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00000033e5600000)
	libpcre.so.1 => not found
	libz.so.1 => /lib64/libz.so.1 (0x00000033dae00000)
	libc.so.6 => /lib64/libc.so.6 (0x00000033d9e00000)
	/lib64/ld-linux-x86-64.so.2 (0x00000033d9600000)
	libfreebl3.so => /lib64/libfreebl3.so (0x00000033e5a00000)
[root@localhost sbin]# 

可知libpcre.so.1 => not found;
系統安裝的pcre的lib一般在/lib或者lib64,源碼編譯安裝的在/usr/local/lib或者/usr/local/lib64
建個軟連接即可,因為本機是linux 64位,所以nginx讀取的是/lib64下面的pcre的lib包,運行一下命令

ln -s /usr/local/lib/libpcre.so.1 /lib64/  

 

6./configure: error: the HTTP gzip module requires the zlib library.

缺少zlib擴展
Ubuntu運行

sudo apt-get insatll zlib1g-dev

redhat 運行

yum install -y zlib-devel

 

7.啟動nginx服務提示98: Address already in use

重啟nginx服務提示錯誤如下:

Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

 

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx: [emerg] still could not bind()

問題描述:地址已被使用。可能nginx服務卡死了,導致端口占用,出現此錯誤。

解決方法:首先用lsof -i :80看下80端口被什么程序占用。lsof返回結果如下:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

nginx 3274 root 6u IPv4 10664 0t0 TCP *:http (LISTEN)

nginx 3547 nginx 6u IPv4 10664 0t0 TCP *:http (LISTEN)

發現是nginx程序,所以我們把nginx服務k掉,重新啟動服務。命令如下:

kill -9 3274

kill -9 3547

service nginx start

Starting nginx:                                            [  OK  ]

OK了,服務成功啟動。

 

參考文章:http://www.luckybird.me/nginx%E8%BD%AC%E5%8F%91socket.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM