Как развернуть интерфейс React + API Rails с помощью nginx, capistrano и пассажира - PullRequest
0 голосов
/ 27 апреля 2018

Я развертываю приложение с внешним интерфейсом React, созданным с использованием create-react-app и Rails API в качестве внутреннего интерфейса. Я не очень разбираюсь в настройке веб-серверов и прокси, поэтому не знаю точно, как заставить его работать на производстве. Я развертываю приложение в Ubuntu на экземпляре Amazon EC2. Nginx - это веб-сервер. Мне нужно настроить его так, чтобы Nginx обслуживал статические файлы из каталога client/build, а затем любые запросы, сделанные к /api, отправлялись в приложение Rails, работающее на порту 3001. Сейчас Nginx обслуживает index.html, а Javascript - это работает правильно, но запросы к /api не идут в нужное место. Любые мысли о том, как настроить Nginx для этого? Вот мой /etc/nginx/sites-enabled/default файл:

server {
       listen 80 default_server;
       listen [::]:80 default_server;
       server_name mydomain.com;
       passenger_enabled on;
       rails_env    staging;
       root         /home/ubuntu/app-name/current/client/build;
       index index.html;

       location /api {
          proxy_pass http://127.0.0.1:3001;
       }
}

Чего мне не хватает? Как мне заставить приложение Rails работать на порте 3001 и отправлять туда все запросы к /api? Нужен ли отдельный блок server в этой конфигурации?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Вот мой рабочий конфиг nginx

  map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
server {
  listen 80 default_server;
  root /home/deploy/www/sublime/current/public;
  index index.html;
  server_name domain.com;
  access_log /home/deploy/www/sublime/logs/access.log;
  error_log /home/deploy/www/sublime/logs/errors.log;
  server_name localhost;
  passenger_enabled on;
  passenger_app_env production;
location ~* ^.+\.(jpeg|gif|png|jpg) {
            proxy_pass http://127.0.0.1:3000;
            proxy_http_version 1.1;
  }
  location /api {
            # Insert your public app path
            proxy_pass http://127.0.0.1:3000;
            proxy_http_version 1.1;
            proxy_set_header Host $http_host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_buffering off;
  }
  location / {
              # First attempt to serve request as file, then
              # as directory, then fall back to displaying a 404.
              try_files $uri /index.html;
  }
}

Вы можете использовать эти репозитории для просмотра конфигурации рельсов. https://github.com/Eth3rnit3/rails-react

0 голосов
/ 14 мая 2018

Я не знаю, решили ли вы уже свою проблему и будет ли это решение применяться к вам, но я думаю, что оно может быть полезно для других людей, которые ищут эту проблему.

Я использую Puma в качестве сервера приложений для запуска моих rails 5 api.

Это файл конфигурации для моей среды разработки:

upstream app {
# Path to Puma SOCK file, here is where you make the connection to your application server
server unix:/path/to/your/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name mydomain.com;

# this is where my react-app is located
root /var/www/development/ram/public/;
index index.html index.htm;

# Serve the static content (React app)
location / {
    try_files $uri /index.html =404;
}

location /api {
    # Insert your public app path
    root /your/rails-app/path/public;
    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
}

error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}

Итак, сравнивая, я думаю, что ваша проблема может быть решена путем добавления корневой директивы, указывающей на публичный каталог rails api

Я надеюсь, что это может дать вам несколько советов о том, как настроить ваш

...