【发布时间】:2017-05-28 03:39:44
【问题描述】:
我试图让端口 80 上的纯 TCP 套接字连接通过端口 80 上的 AWS 上的 Docker 容器。到目前为止,我有:
设置正确的安全组以让负载均衡器上的端口 80 通过,它设置为 tcp 连接,而不是 http。
能够看到EB创建的e2c实例上的nginx日志。报告如下:
172.31.22.8 - - [12/Jan/2017:20:44:43 +0000] "...数据..." 400 173 "-" "-"
- 然后创建套接字的程序报告:
HTTP/1.1 400 Bad Request Server: nginx/1.10.1 Date: Thu, 12 Jan 2017 21:05:54 GMT Content-Type: text/html Content-Length: 173 Connection: close <html> <head><title>400 Bad Request</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <hr><center>nginx/1.10.1</center> </body> </html>
我尝试了许多不同的 nginx 配置。但是 默认情况下,在我开始之前配置如下:
/etc/nginx/nginx.conf
# Elastic Beanstalk Nginx Configuration File
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
log_format healthd '$msec"$uri"$status"$request_time"$upstream_response_time"$http_x_forwarded_for';
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
/etc/nginx/conf.d/elasticbeanstalk-nginx-docker-upstream.conf
upstream docker {
server 172.17.0.3:80;
keepalive 256;
}
/etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf
server {
listen 80;
gzip on;
gzip_comp_level 4;
gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
}
access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://docker;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我知道负载均衡器正在工作,因为数据到达了运行 docker 的 nginx e2c 实例。但是 nginx 不会将请求转发到 docker 容器。是的,有一个应用程序在容器的 80 端口上运行,它是一个绑定到 80 端口上的 0.0.0.0 的 C 套接字。所以没有 HTTP 正确吗?它是 TCP 吗?
所以我的问题是,配置文件必须是什么才能让 nginx 将 TCP 套接字连接转发到 docker 容器??
【问题讨论】:
标签: sockets amazon-web-services nginx docker amazon-elastic-beanstalk