Nginx conf 模板无法与 dokku 配合使用

Nginx conf 模板无法与 dokku 配合使用

我被以下 nginx conf 模板困扰:

# Special characters - dollar signs, spaces inside of quotes, etc. -
# should be escaped with a single backslash or can cause deploy failures.

server {
    listen      [::]:80;
    listen      80;
    server_name $NOSSL_SERVER_NAME;
    access_log  /var/log/nginx/${APP}-access.log;
    error_log   /var/log/nginx/${APP}-error.log;

    # set a custom header for requests
    # add_header X-Served-By www-ec2-01;

    location    / {
      proxy_pass  http://$APP;
      proxy_http_version 1.1;
      proxy_set_header Upgrade \$http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host \$http_host;
      proxy_set_header X-Forwarded-Proto \$scheme;
      proxy_set_header X-Forwarded-For \$remote_addr;
      proxy_set_header X-Forwarded-Port \$server_port;
      proxy_set_header X-Request-Start \$msec;
    }

    include $DOKKU_ROOT/$APP/nginx.conf.d/*.conf;

    # Proxy download 
    location ~* ^/internal_redirect/(.*?)/(.*) {
    # Do not allow people to mess with this location directly
    # Only internal redirects are allowed
    internal;

    # Location-specific logging
    access_log logs/internal_redirect.access.log main;
    error_log logs/internal_redirect.error.log warn;

    # Extract download url from the request
    set $download_uri \$2;
    set $download_host \$1;

    # Compose download url
    set $download_url http://\$download_host/\$download_uri;

    # Set download request headers
    proxy_set_header Host \$download_host;
    proxy_set_header Authorization '';

    # The next two lines could be used if your storage 
    # backend does not support Content-Disposition 
    # headers used to specify file name browsers use 
    # when save content to the disk
    proxy_hide_header Content-Disposition;
    add_header Content-Disposition 'attachment; filename="\$args"';

    # Do not touch local disks when proxying 
    # content to clients
    proxy_max_temp_file_size 0;

    # Download the file and send it to client
    proxy_pass \$download_url;
  }
}

dokku 文档告诉我用单个 \ 来转义“$”,所以我这样做了。

nginx 高手能告诉 nginx 新手上述模板有什么问题吗?

Dokku 输出以下错误:

remote: nginx: [emerg] unknown log format "main" in /home/dokku/everseller/nginx.conf:117
remote: nginx: configuration file /etc/nginx/nginx.conf test failed

谢谢!

==== 更新了配置 ====

# Special characters - dollar signs, spaces inside of quotes, etc. -
# should be escaped with a single backslash or can cause deploy failures.

server {
  listen      [::]:80;
  listen      80;
  server_name $NOSSL_SERVER_NAME;
  access_log  /var/log/nginx/${APP}-access.log;
  error_log   /var/log/nginx/${APP}-error.log;

  # set a custom header for requests
  # add_header X-Served-By www-ec2-01;

  location    / {
    proxy_pass  http://$APP;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }

  include $DOKKU_ROOT/$APP/nginx.conf.d/*.conf;

  # Proxy download 
  location ~* ^/internal_redirect/(.*?)/(.*) {
  # Do not allow people to mess with this location directly
  # Only internal redirects are allowed
  internal;

  # Location-specific logging
  access_log logs/internal_redirect.access.log main;
  error_log logs/internal_redirect.error.log warn;

  # Extract download url from the request
  set $download_uri $2;
  set $download_host $1;

  # Compose download url
  set $download_url http://$download_host/$download_uri;

  # Set download request headers
  proxy_set_header Host $download_host;
  proxy_set_header Authorization '';

  # The next two lines could be used if your storage 
  # backend does not support Content-Disposition 
  # headers used to specify file name browsers use 
  # when save content to the disk
  proxy_hide_header Content-Disposition;
  add_header Content-Disposition 'attachment; filename="$args"';

  # Do not touch local disks when proxying 
  # content to clients
  proxy_max_temp_file_size 0;

  # Download the file and send it to client
  proxy_pass $download_url;
    }
}

答案1

美元符号表示变量。因此如果在某个地方使用不是指示变量时应进行转义。

你的配置包含很多变量,其中美元符号应该不是被转义,例如 proxy_set_header Upgrade \$http_upgrade;
应该是
proxy_set_header Upgrade $http_upgrade;

proxy_set_header Host \$http_host;应该读proxy_set_header Host $http_host;等等。

顺便说一句:我不是奇才;-)

相关内容