Cấu hình Apache2 thành proxy WebSocket?


40

Giao thức WebSocket là một phần mở rộng của giao thức HTTP. Tuy nhiên, mô-đun proxy của Apache2 dường như không biết về nó và loại bỏ các tiêu đề quan trọng, chuyển đổi cuộc gọi thành cuộc gọi HTTP tiêu chuẩn.

Có cách nào để khiến Apache2 (1) hiểu WebSocket hoặc (2) chỉ đơn giản là mù quáng vượt qua bất cứ thứ gì nó nhận được?

Câu trả lời:


23

Hiện tại có một mô-đun trong thân cây Apache được gọi là mod_proxy_wstunnel cho phép mod_proxy (ProxyPass / ProxyPassReverse) đi qua lưu lượng truy cập WebSocket. Ai đó đã viết một bài đăng trên blog về mod_proxy_wstunnel back-port cho Apache 2.4 / 2.2 và cung cấp một bản vá để làm như vậy.

Tôi đã tìm ra các hướng dẫn cụ thể để thiết lập mod_proxy_wstunnel trên Ubuntu (được thử nghiệm với Ubuntu Server 11.10 và Apache 2.2.20) và đăng chúng lên blog của tôi. Tôi đã sao chép chúng dưới đây:

# Check apache version (should be 2.2.20 as of writing, if not adjust the next step)
dpkg -s apache2

# Checkout apache source
svn checkout http://svn.apache.org/repos/asf/httpd/httpd/tags/2.2.20/ httpd-2.2.20

# Get patch and apply it
wget http://cafarelli.fr/gentoo/apache-2.2.24-wstunnel.patch
cd httpd-2.2.20
patch -p1 < ../apache-2.2.24-wstunnel.patch

# Build Apache 
svn co http://svn.apache.org/repos/asf/apr/apr/branches/1.4.x srclib/apr
svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.3.x srclib/apr-util
./buildconf
./configure --enable-proxy=shared --enable-proxy_wstunnel=shared
make

# Copy the module and recompiled mod_proxy (for new symbols) to the ubuntu apache installation and update the permissions to match the other modules
sudo cp modules/proxy/.libs/mod_proxy{_wstunnel,}.so /usr/lib/apache2/modules/
sudo chmod 644 /usr/lib/apache2/modules/mod_proxy{_wstunnel,}.so
echo -e "# Depends: proxy\nLoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so" | sudo tee -a /etc/apache2/mods-available/proxy_wstunnel.load

# Enable the module (also make any configuration changes you need)
sudo a2enmod proxy_wstunnel
sudo service apache2 restart

2
Khi tôi làm theo hướng dẫn của bạn, có một bước mà bạn không có. Sau khi thực hiện kiểm tra tháng tư, tôi phải chạy ./buildconfigđể tạo tập tin cấu hình. Và có một vài phụ thuộc mà nó bảo tôi cài đặt.
notbad.jpeg

điều này có liên quan đến Glassfish 4 qua wss: (SSL)
Archimedes Trajano

1
@ notbad.jpeg: Bạn có thể có nghĩa là ./buildconf (không phải ./buildconfig) :-)
Erik Forsberg

1
Chỉ là phản hồi của tôi ... cái này được cài đặt và tải trong apache 2.2.22-1ubfox1.10 từ Ubuntu 12.04, nhưng cuối cùng nó không hoạt động với tôi. Proxy đã xóa tiêu đề "Nâng cấp" (mã nguồn cho biết "RFC2616 13.5.1 nói rằng chúng ta nên loại bỏ các tiêu đề này"), đây là tiêu đề mà máy chủ mong đợi, không chỉ một bước nhảy, vì vậy nó không hoạt động với tôi, và tôi đã thay thế nó bằng một quy tắc DNAT iptables thay thế.
Peter

11

Không có gì để chỉ ra Apache httpd sẽ hỗ trợ họ bất cứ lúc nào sớm.

Nếu bạn phải chạy websockets thông qua apache, hãy thử mod_pywebsocket . Tôi đã thử nó, và nó hoạt động.

Dưới đây là một vài lựa chọn thay thế tôi thích:



3

Vui lòng xem tại http://github.com/disconnect/apache-websocket

Mô-đun apache-websocket là mô-đun máy chủ Apache 2.x có thể được sử dụng để xử lý các yêu cầu sử dụng giao thức WebSocket bởi máy chủ Apache 2.x.


Tôi nhìn vào dự án github ở trên. Nó không hoạt động như proxy. trích dẫnThe module consists of a plugin architecture ...
guettli

1

Câu trả lời này thêm vào câu trả lời của @Andrew Moss về cách định cấu hình chính xác VirtualHostđể hoạt động với socket.io 1.0! Hãy bỏ qua phần về CentOS!


Nếu bạn bị kẹt trên CentOS 6, đây là cách thực hiện:

  1. Tải xuống nguồn backported cho mod_proxy_wstunnelmô-đun tại đây (sao chép Gist hoặc tải xuống các tệp riêng lẻ)
  2. Cài đặt mọi thứ cần thiết để xây dựng: yum install make gcc httpd-devel
  3. Thiết lập môi trường RPM Build (về cơ bản là người dùng không có đặc quyền và một số thư mục)
  4. Sao chép .c-file vào SOURCESthư mục con của môi trường và .spec-file vào SPECSthư mục con.
  5. Chạy rpmbuild -ba mod_proxy_wstunnel.spec
  6. Gói hiện nằm trong SRPMSthư mục con
  7. Cài đặt gói: rpm -i /path/to/package.rpm
  8. Lợi nhuận

Điều này cũng sẽ tự động tải mô-đun trong Apache, vì vậy bạn chỉ cần khởi động lại nó với service httpd restart.


Việc thiết lập VirtualHostđể thực sự phục vụ máy chủ Socket.io và tập lệnh máy khách (theo mặc định có sẵn bên dưới http://your.server/socket.io/socket.io.js) phức tạp hơn một chút trên Apache 2.2, do có lỗi trong mod_proxymô-đun :

Cho quy tắc viết lại sau đây:

RewriteRule    ^/ws(.*)$  ws://localhost:9000/ws  [P]

mod_rewrite coi đây là một filepath để nhật ký truy cập hiển thị:

[26/Sep/2013:09:46:07 -0400] "GET /ws://localhost:9000/ws HTTP/1.1" 400 317

Vì vậy, bạn không thể sử dụng ws-protatio trong quy tắc viết lại , vì điều đó bên trong sẽ biến thành yêu cầu HTTP GET.

Có một cách giải quyết mặc dù:

<VirtualHost *:80>
        ServerName your.server

        # Proxy socket.io Websocket
        RewriteEngine On

        # socket.io 1.0+ starts all connections with an HTTP polling request
        RewriteCond %{QUERY_STRING} transport=polling       [NC]
        RewriteRule /(.*)           http://localhost:8081/$1 [P]

        ProxyRequests Off

        # Explicitly send the request for the client-script to HTTP:
        ProxyPass /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
        ProxyPassReverse /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js

        # Anything else goes to the WebSocket protocol:
        ProxyPass /socket.io/ ws://localhost:8081/socket.io/
        ProxyPassReverse /socket.io/ ws://localhost:8081/socket.io/

        # Any additional stuff (the actual site) comes here
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/
</VirtualHost>

Điều này đảm bảo rằng tất cả mọi thứ gửi đến /socket.iođi vào ws://-protocol, ngoại trừ yêu cầu dài phiếu (mà là một cơ chế dự phòng khi WebSockets không có sẵn) và yêu cầu cho khách hàng thư viện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.