我在AWS上运行应用程序' Elastic Beanstalk使用在64位Amazon Linux / 4.5.0上运行的配置Node.js和Nginx。
我想添加请求标头" X-My-Header"作为access.log的字段。除此之外,我将使用复合默认nginx日志+我的标题创建一个新的日志文件。我已经发现了几个类似的问题,特别是关于使用nginx进行日志记录,但是EB方面抛出了一个额外的曲线球,它是如何通过/.ebextensions配置文件更新nginx配置的。
我已经完成创建日志文件,但它并没有填充任何内容。我也试过更新access.log文件,但似乎也没有。我看到其他人添加标题将使用格式" $ http _",它似乎是" X-Header-Example"的http请求标题。格式化为" $ http_header_example" (参见" $ http_user_agent"在nginx复合默认值中),虽然不想浪费时间假设,但请注意我添加了" $ http_x-my-header"和" $ http_x_my_header"。
尝试1:更新现有的access.log格式
files:
/etc/nginx/conf.d/01_proxy.conf:
owner: root
group: root
content: |
log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" - "$http_x_my_header" - "$http_x-my-header"';
access_log /var/log/nginx/access.log my_log_format;
结果:access.log不包含任何其他字段。它甚至没有空""
或-
。
尝试2:创建新的日志文件
files:
/etc/nginx/conf.d/01_proxy.conf:
owner: root
group: root
content: |
log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" - "$http_x_my_header" - "$http_x-my-header"';
access_log /var/log/nginx/new_log.log my_log_format;
结果:当我从EB dashbaord导出日志时,new_log.log现在出现在var/log/nginx
中。但是,它完全是空的。
我读了一些其他类似的问题,提到删除文件和重启服务器有时会有所帮助。我尝试重新启动应用程序,甚至通过EB仪表板完全重建环境,但都没有导致不同的结果。
我主要基于this medium article第2.1节的解决方案。但是,当我尝试将container_command
添加到我的.config文件时,我的整个环境都停止了工作。我不得不恢复到不同的部署,然后重建环境以使其再次运行。
任何提示?
我的目标是将此请求标头与进入的请求相关联。理想情况下,我可以更新现有的默认access.log。我会解决一个单独的文件。或者,如果您对我如何能够访问此信息有任何其他建议,我会全力以赴!感谢。
Here它表明您可以完全替换默认的nginx.config,因此我尝试删除我的其他文件,而是将默认值从medium article复制/粘贴到/.ebextensions/nginx/nginx.config
之前文件,除了在那里添加我的更改。我更新了log_format main
以包含我的"$http_x_my_header"
值。
不幸的是,部署失败并显示以下消息:
应用程序版本中的配置文件.ebextensions / nginx / nginx.config包含无效的YAML或JSON。 YAML例外:Yaml无效:预期'',但在"",第7行,第1列中找到标量:include / usr / share / nginx / modules ... ^,JSON异常:无效的JSON:位置0处的意外字符(u)。更新配置文件。
有问题的行是include /usr/share/nginx/modules
,它存在并且在媒体文章提供的默认值中正常工作。
我希望这可能是一个肮脏的修复,我至少可以从中得到一些结果,但是,唉,它似乎还有另一个障碍。
答案 0 :(得分:1)
我的解决方案是覆盖 nginx.conf。
nodejs 平台的 AWS doc 是删除现有的 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf 并替换为您自己的配置。我已经测试过它也有效。对于Docker平台,需要删除/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf。
以下代码仅适用于 docker 平台。版本:Docker 在 64 位 Amazon Linux/2.16.7 上运行
您应该在您的平台中找到 nginx.conf 的默认代码。
将 .ebextensions/nginx/00-my-proxy.config 添加到您的构建文件夹
files:
/etc/nginx/nginx.conf:
mode: "000644"
owner: root
group: root
content: |
# 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';
upstream docker {
server 172.17.0.2:3000;
keepalive 256;
}
log_format timed_combined '"$http_x_forwarded_for"'
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time $pipe';
map $http_upgrade $connection_upgrade {
default "upgrade";
"" "";
}
server {
listen 80;
gzip on;
gzip_comp_level 4;
gzip_types 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 timed_combined;
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;
}
}
}
在 EB docker 平台中,Nginx config 中的 server 块在另一个文件中 /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf
server {
listen 80;
access_log /var/log/nginx/access.log;
}
nginx.conf 的入口配置是
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
因此添加此自定义配置只会导致此结果 - 空日志文件。
files:
/etc/nginx/conf.d/01_proxy.conf:
owner: root
group: root
content: |
log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" - "$http_x_my_header" - "$http_x-my-header"';
access_log /var/log/nginx/new_log.log my_log_format;
log_format ...
access_log ...
server {
...
}
我在my github中写了详细信息。
答案 1 :(得分:0)
我已经通过自己在类似问题中的回答回答了这个问题:
AWS EB + nginx: Update access.log format to obfuscate sensitive get request parameters
它的缩写:对于Node AWS EB环境,nginx配置的服务器指令位于自动生成的00_elastic_beanstalk_proxy.conf
文件中。在这里,它们调用access_log /var/log/nginx/access.log main
,因此添加尝试更改access_log的ebextension配置将被覆盖。
我的解决方案是双重的:通过基于默认值上传自定义nginx.conf来覆盖主要的log_format(AWS表示您可以做到这一点,但建议您提取默认创建的一个,并在更新时重新检查它环境图片的版本),并且我还必须对自动生成的文件执行相同的操作,以执行一些逻辑来设置要记录的新变量。
有关更多详细信息,请参见上面链接的答案,其中包含有关该过程的更多信息。