NGINX для обратного прокси-сервера и включить SSL (wss://)?
Я так потерялся и новичок в создании NGINX сам по себе, но я хочу иметь возможность включить безопасные веб-сайты без дополнительного слоя.
Я не хочу включать SSL на сервере websocket, но вместо этого я хочу использовать NGINX для добавления уровня SSL для всего.
Каждая веб-страница там говорит, что я не могу этого сделать, но я знаю, что могу! Благодаря тому, кто (я) может показать мне, как!
Ответы
Ответ 1
Просто отметим, что nginx теперь поддерживает Websockets в выпуске 1.3.13. Пример использования:
location /websocket/ {
proxy_pass http://backend_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
Вы также можете проверить журнал изменений nginx и документацию по прокси WebSocket.
Ответ 2
Не бойся, потому что смелая группа программистов Ops решила ситуацию с брендом, шлепающим новый nginx_tcp_proxy_module
Написано в августе 2012 года, поэтому, если вы из будущего, вы должны сделать домашнее задание.
Необходимые условия
Предполагается, что вы используете CentOS:
- Удалить текущий экземпляр NGINX (предположим, что для этого используется dev-сервер)
- Если возможно, сохраните старые конфигурационные файлы NGINX, чтобы их можно было повторно использовать (включая ваш
init.d/nginx
script)
-
yum install pcre pcre-devel openssl openssl-devel
и любые другие необходимые библиотеки для создания NGINX
- Получите nginx_tcp_proxy_module из GitHub здесь https://github.com/yaoweibin/nginx_tcp_proxy_module и запомните папку, в которую вы ее разместили (убедитесь, что она не застегнута)
Создайте свой новый NGINX
Опять же, предполагает CentOS:
-
cd /usr/local/
-
wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
-
tar -xzvf nginx-1.2.1.tar.gz
-
cd nginx-1.2.1/
-
patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
-
./configure --add-module=/path/to/nginx_tcp_proxy_module --with-http_ssl_module
(вы можете добавить больше модулей, если они вам понадобятся)
-
make
-
make install
Дополнительно:
-
sudo /sbin/chkconfig nginx on
Настройка Nginx
Не забудьте сначала скопировать старые файлы конфигурации, если вы хотите их повторно использовать.
Важно: вам нужно будет создать директиву tcp {}
на самом высоком уровне в вашем conf. Убедитесь, что он не находится в вашей директиве http {}
.
В приведенном ниже примере конфигурации показан один сервер веб-сервера upstream и два прокси-сервера для SSL и Non-SSL.
tcp {
upstream websockets {
## webbit websocket server in background
server 127.0.0.1:5501;
## server 127.0.0.1:5502; ## add another server if you like!
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
server_name _;
listen 7070;
timeout 43200000;
websocket_connect_timeout 43200000;
proxy_connect_timeout 43200000;
so_keepalive on;
tcp_nodelay on;
websocket_pass websockets;
websocket_buffer 1k;
}
server {
server_name _;
listen 7080;
ssl on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.key;
timeout 43200000;
websocket_connect_timeout 43200000;
proxy_connect_timeout 43200000;
so_keepalive on;
tcp_nodelay on;
websocket_pass websockets;
websocket_buffer 1k;
}
}
Ответ 3
Это сработало для меня:
location / {
# redirect all HTTP traffic to localhost:8080
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
- заимствован из: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf
Ответ 4
для .net core 2.0 Nginx с SSL
location / {
# redirect all HTTP traffic to localhost:8080
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
Это сработало для меня
Ответ 5
Для меня это дошло до настройки местоположения proxy_pass
. При необходимости изменить http://nodeserver
на https://nodeserver
и иметь действующую настройку SSL-сертификата на стороне сервера node. Таким образом, когда я представляю внешний node сервер, мне нужно только изменить IP, а все остальное останется той же конфигурацией.
Я надеюсь, что это поможет кому-то на этом пути... Я все время смотрел на проблему... вздох...
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream nodeserver {
server 127.0.0.1:8080;
}
server {
listen 443 default_server ssl http2;
listen [::]:443 default_server ssl http2 ipv6only=on;
server_name mysite.com;
ssl_certificate ssl/site.crt;
ssl_certificate_key ssl/site.key;
location /horizon {
proxy_pass https://nodeserver;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_intercept_errors on;
proxy_redirect off;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_ssl_session_reuse off;
}
}
Ответ 6
Хорошая, краткая статья Pankaj Malhotra, рассказывающая, как это сделать с NGINX, доступна здесь.
Базовая конфигурация NGINX приведена ниже:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream appserver {
server 192.168.100.10:9222; # appserver_ip:ws_port
}
server {
listen 8888; // client_wss_port
ssl on;
ssl_certificate /path/to/crt;
ssl_certificate_key /path/to/key;
location / {
proxy_pass http://appserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
Ответ 7
Использование nginx/1.14.0
у меня есть websocket-сервер, работающий через порт 8097, и пользователи подключаются к wss через порт 8098, nginx просто расшифровывает содержимое и перенаправляет его на сервер websocket
Так что у меня есть этот файл конфигурации (в моем случае /etc/nginx/conf.d/default.conf
)
server {
listen 8098;
ssl on;
ssl_certificate /etc/ssl/certs/combined.pem;
ssl_certificate_key /root/domain.key;
location / {
proxy_pass http://hostname:8097;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}