我有一些UI(Angular)目前部署在ECS Fargate上。这些应用程序是使用基本nginx镜像构建的,并且在nginx.conf文件中设置了进一步的配置等。所有这些应用程序还通过AWS ALB进行过滤,并为它们设置了路由路径。目前,这些应用程序中的每一个都使用 * 单独的 * nginx容器,并且它们工作正常。
然而,我想使用 one nginx容器作为代理来提供这些服务,从S3中提取UI文件,但仍然使用ALB来路由请求。
在这一点上,我只是试图让一个样本Angular应用程序工作。我已经使用ng build构建了dist文件,并在s3中加载了工件。更新nginx配置后,我可以在浏览器中加载index.html,但对于css和js文件,它要么找不到文件,要么由于某种原因没有加载它们(见下面的png)。我在ALB上设置了一个默认路由,当路径上没有找到工件时,它会返回一条文本消息,这样看起来就像是返回了什么。
的数据
我尝试了各种方法来让它工作,但没有找到解决方案。以下是我使用的基本设置文件。我需要一个比我更了解nginx的人的洞察力来获得前进的道路。
插接文件
FROM nginx:1.16.1-alpine
COPY nginx.conf /etc/nginx/
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN cp -r /usr/share/nginx/html /etc/nginx/html
RUN chown nginx:nginx /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
EXPOSE 80
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["nginx"]
字符串
entrypoint.sh
#!/bin/sh
sed -i -e 's/<bucketnamepassedinhere>/${S3BUCKET}/;' \
-i -e 's/<hostnamepassedhere>/${HOSTNAME}/;' \
-i -e 's/8.8.8.8/{DNS}/;' \
chown nginx:nginx /etc/nginx/nginx.conf \
/etc/nginx/nginx.conf
exec "$@"
型
nginx.conf
daemon off;
user nginx;
worker_processes 4;
events {
worker_connections 1024;
}
http {
log_format logstash_json escape=json '{'
'"agent": "$http_user_agent", '
'"body_bytes_sent": "$body_bytes_sent", '
'"bytes_sent": "$bytes_sent", '
'"clientip": "$remote_addr", '
'"http_host": "$http_host", '
'"log_timestamp": "$time_local", '
'"proxy_host": "$proxy_host", '
'"referrer": "$http_referer", '
'"request": "$request", '
'"request_time": $request_time, '
'"request_length": $request_length, '
'"status": $status, '
'"upstream_addr": "$upstream_addr", '
'"upstream_response_time": "$upstream_response_time", '
'"upstream_status": "$upstream_status", '
'"x_forwarded_for": "$http_x_forwarded_for", '
'"x_forwarded_port": "$http_x_forwarded_port", '
'"x_forwarded_proto": "$http_x_forwarded_proto"'
'}';
access_log /var/log/nginx/access.log logstash_json;
gzip on;
gzip_proxied any;
gzip_vary on;
gzip_types application/json application/x-tar;
gzip_min_length 1000;
variables_hash_max_size 1024;
variables_hash_bucket_size 64;
server_names_hash_bucket_size 64;
types_hash_max_size 2048;
types_hash_bucket_size 64;
client_max_body_size 100m;
proxy_read_timeout 60;
proxy_buffers 256 32k;
proxy_busy_buffers_size 64k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
# default_type application/octet-stream;
include mime.types;
include /etc/nginx/mime.types;
server {
listen 80;
server_name <servername>.com;
resolver 8.8.8.8 valid=30s;
index index.html;
gzip_types text/plain application/xml application/x-javascript text/css application/json text/javascript;
location = /app/ {
set $S3BUCKET "<bucketnamepassedinhere>.s3.amazonaws.com";
include /etc/nginx/mime.types;
proxy_buffering off;
proxy_ignore_headers "Set-Cookie";
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-meta-s3cmd-attrs;
proxy_hide_header Set-Cookie;
proxy_set_header Host $S3BUCKET;
proxy_set_header Connection "";
proxy_intercept_errors on;
proxy_pass https://$S3BUCKET/index.html;
break;
}
}
}
型
注意:如果我只使用location /app
而不是location = /app
,健康检查失败,经过一些测试后,这似乎是因为ALB中设置的路由路径。我发现他们需要在每个相同的,但我可能是错的。
我再次能够到达index.html,只是出于某种原因没有加载css和js。存储桶中的所有dist文件都位于同一位置(即,没有单独的文件夹)。有什么见解,我错过了什么?
1条答案
按热度按时间mf98qq941#
我刚刚提交了这份PR,我希望它能对你的问题有所帮助。
https://github.com/nginxinc/nginx-s3-gateway/pull/158
它允许您指定要删除的请求的路径的一部分。例如,假设您有一个ALB规则,将流量从**www.mysite.com/mybucket发送到S3网关,该网关连接到存储桶s3://mybucket**。如果您请求**www.mysite.com/mybucket/myfile.txt,请求通常会失败,因为它会尝试从s3://mybucket/mybucket/myfile.txt**中拉取文件。
通过此更改,将新的env var设置为
字符串
将尝试从s3://mybucket/myfile.txt中提取文件。