Nginx reverse proxy websocket configuration instance

  • 2020-05-09 19:52:17
  • OfStack

Recently, there is a requirement to use nginx reverse agent websocket. After searching 1 data, it has been tested and passed. Only 1 record is made in this paper


Note: Look at the official documentation Nginx in 1.3 Later versions will be supported websocket Reverse proxy, so you want to use support websocket The function must be upgraded to 1.3 Later versions, so I downloaded it here Tengine The latest version of the test

1. Download the latest source code of tengine


wget http://tengine.taobao.org/download/tengine-2.0.3.tar.gz

2. Install base dependencies


yum -y install pcre*
yum -y install zlib*
yum -y install openssl*

3. Unzip, compile and install


tar -zxvf tengine-2.0.3.tar.gz cd tengine-2.0.3 ./configure --prefix= The installation directory make sudo make install

The configuration of nginx.conf is as follows:


user apps apps;
worker_processes  4; # This is configured because I'm using a virtual machine 4 And the other tengine Can be automatically based on CPU The number sets the number of processes and bindings CPU affinity
# worker_processes auto
# worker_cpu_affinity auto error_log  logs/error.log; pid        logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535; events {
    use epoll;
    worker_connections  65535;
} # load modules compiled as Dynamic Shared Object (DSO)
#
#dso {
#    load ngx_http_fastcgi_module.so;
#    load ngx_http_rewrite_module.so;
#} http {
    include       mime.types;
    default_type  application/octet-stream;     server_names_hash_bucket_size 128;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 32k;
    client_max_body_size 80m;     sendfile on;
    tcp_nopush     on;     client_body_timeout  5;
    client_header_timeout 5;
    keepalive_timeout  5;
    send_timeout       5;     open_file_cache max=65535 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;     tcp_nodelay on;     fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;     client_body_buffer_size  512k;
    proxy_connect_timeout    5;
    proxy_read_timeout       60;
    proxy_send_timeout       5;
    proxy_buffer_size        16k;
    proxy_buffers            4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;     gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    proxy_temp_path   /dev/shm/temp;
    proxy_cache_path  /dev/shm/cache levels=2:2:2   keys_zone=cache_go:200m inactive=5d max_size=7g;     log_format log_access  '$remote_addr - $remote_user [$time_local] "$request" "$request_time" "$upstream_response_time"'
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for $host $hostname' ;     #websocket I need to add this
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }     include /home/apps/tengine/conf/test.com; }

test.com configuration file contents:


upstream test.com {
   server 192.168.1.5:9000;
} server {
    listen       80;
    server_name  test.com;     #charset koi8-r;     #access_log  logs/host.access.log  main;     location  ^~  /websocket {
        proxy_pass http://test.com;         proxy_redirect    off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    } }

Parse the map directive

Above nginx. conf map $$connection_upgrade http_upgrade role in configuration, reference http: / / www ttlsa. com/nginx/using - nginx - map - method /

This function is mainly to construct and change the value of $connection_upgrade according to the value of $http_upgrade in the client request, that is, to create a new variable $connection_upgrade according to the value of the variable $http_upgrade. The rule to create is what is inside the {}, please see the configuration:


    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

The rules are not matched, so using the default, which is $connection_upgrade, the value 1 will be upgrade. Then if $http_upgrade is an empty string, the value will be close. Personal understanding!


Related articles: