如何配置nginx.conf代理以与S3和AWS ALB一起使用

4szc88ey  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(158)

我有一些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文件都位于同一位置(即,没有单独的文件夹)。有什么见解,我错过了什么?

mf98qq94

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设置为

STRIP_LEADING_DIRECTORY_PATH=/mybucket

字符串
将尝试从s3://mybucket/myfile.txt中提取文件。

相关问题