Сервер не может видеть статические ресурсы, скомпилированные с помощью Brunch (Phoenix Framework)
У меня самая странная техническая проблема. В то время как мой сайт отлично работал в разработке и раньше работал нормально в производственной среде, во время последней сборки он по непонятным причинам прекратил распознавать статические активы и обслуживает старую версию favicon. Я даже пытался откатить весь репо, но у меня точно такая же проблема. Старый фавикон больше не существует в репо.
У меня есть обратный прокси-сервер nginx перед процессом сервера Cowboy со следующим конфигом:
upstream phoenix {
server 127.0.0.1:4000;
}
# Default server configuration
#
server {
listen 80;
server_name haaksploits.com www.haaksploits.com;
return 301 https://$server_name$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2;
listen [::]:443 ssl http2;
rewrite ^/(.*)/$ /$1 permanent;
server_name haaksploits.com wwww.haaksploits.com;
ssl_certificate /etc/letsencrypt/live/haaksploits.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/haaksploits.com/privkey.pem;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
access_log /var/log/nginx/sub.log combined;
root /var/www/haaksploits.com/html;
# Add index.php to the list if you are using PHP
index index.html index.php index.htm;
location / {
allow all;
# Proxy Headers
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Cluster-Client-Ip $remote_addr;
# WebSockets
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://phoenix;
include /etc/nginx/mime.types;
}
location ~ /.well-known {
allow all;
}
# Enable browser caching
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
location ~* \.(pdf)$ {
expires 10d;
}
# pass PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
Как вы можете видеть, у меня включено кэширование, но я попытался установить его на одну секунду, и это не помогает, и в любом случае я загрузил новый значок до того, как возникла проблема, поскольку он работал без проблем. Мой mix.exs:
defmodule Haaksploits.Mixfile do
use Mix.Project
def project do
[
app: :haaksploits,
version: "0.2.3",
elixir: "~> 1.4",
elixirc_paths: elixirc_paths(Mix.env),
compilers: [:phoenix, :gettext] ++ Mix.compilers,
start_permanent: Mix.env == :prod,
aliases: aliases(),
deps: deps()
]
end
def application do
[
mod: {Haaksploits.Application, []},
extra_applications: [:logger, :runtime_tools, :ueberauth, :ueberauth_google]
]
end
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
defp deps do
[
{:phoenix, "~> 1.3.0"},
{:phoenix_pubsub, "~> 1.0"},
{:phoenix_ecto, "~> 3.2"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.10"},
{:phoenix_live_reload, "~> 1.0", only: :dev},
{:gettext, "~> 0.11"},
{:cowboy, "~> 1.0"},
{:ueberauth_google, "~> 0.2"},
{:ja_serializer, "~> 0.11.2"},
{:guardian, "~> 0.14.2"}
]
end
defp aliases do
[
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
"ecto.reset": ["ecto.drop", "ecto.setup"],
"test": ["ecto.create --quiet", "ecto.migrate", "test"]
]
end
end
И мой prod.exs:
use Mix.Config
config :haaksploits, HaaksploitsWeb.Endpoint,
http: [port: 4000],
url: [host: "haaksploits.com", port: 80],
cache_static_manifest: "priv/static/cache_manifest.json",
server: true,
code_reloader: false
config :logger, level: :info
import_config "prod.secret.exs"
Единственное, о чем я могу подумать, это то, что в последней сборке до того, как возникла проблема, произошла ошибка, сообщающая о том, что Distillery отсутствовал, поэтому я добавил ее обратно, чтобы завершить сборку. С тех пор я удалил Distillery и Edeliver, так как в данный момент они мне действительно не нужны, и, хотя проблема не исчезла, мне интересно, если это что-то изменило с файлами, из-за чего сервер выглядит неправильно место для активов.
Если это так, все, что мне действительно нужно, это знать, где Distillery ищет эти файлы, и как заставить Phoenix снова искать правильные места для статических ресурсов. Или разрешить доступ к файлам, если доступ каким-либо образом заблокирован.
Когда я смотрю в / priv / static все файлы там, где они должны быть.
Обновить:
Я тестировал на машине без nginx, и это, похоже, не проблема Phoenix/Distillery, а что-то, связанное с конфигурацией nginx... Так что, возможно, проблема с кэшированием в конце концов........
Обновить:
Это не было проблемой, так как она по-прежнему не срабатывает, когда вы полностью выводите nginx из уравнения. Он также дает сбой при использовании бранча или ликеро-водочного завода для сборки релиза, но только на двух производственных серверах (один Debian, один Ubuntu), а не на моем Mac разработки. Я пытаюсь встраивать свою среду разработки, затем вручную подбираю архив сборки из рабочей среды.
Обновить:
Решение tarball не работает из-за архитектурных различий между машиной для разработки и машиной для производства. Попытка использовать edeliver, чтобы обойти.
Обновить:
Кажется, что работает нормально, когда к процессу обращаются напрямую с IP-адреса, так что единственное, что я могу вспомнить, это что-то не так между этапом разрешения имени домена и доступом к статическим ресурсам. Оставляя решение edeliver и вместо этого пытаясь использовать Cloudflare, посмотрите, поможет ли это.
1 ответ
Источник (по крайней мере для моего основного сервера, казалось, были другие проблемы, вызывающие ту же ошибку на другом, что странно, но не очень) проблемы в итоге оказались не так с сертификатами SSL, которые каким-то образом привели к тому, что доступ был заблокирован только часть контента (???).
Я очистил все настройки nginx, удалил все настройки SSL certbot, зарегистрировал сайт для Cloudflare и включил вместо этого их службу SSL. Это решило проблему.