让我们加密的Nginx加密"欢迎来到Nginx"而不是rails应用程序

Jak*_*ake 7 ubuntu passenger nginx digital-ocean lets-encrypt

我最近将我的Ruby on Rails应用程序部署到一个简单的Ubuntu 16.04 DigitalOcean Droplet,其中包含Nginx,passenger和Let的加密.

rails应用程序只适用于乘客和Nginx,但在我安装了Let's Encrypt后,它指向"欢迎使用Nginx"页面而不是我的rails应用程序.

我可以进行更改以查看"欢迎使用Nginx!" 页面并在浏览器中查看结果.

当我将启用网站的配置中的根位置更改为我的应用程序路径而不是/ html时,我收到403 Forbidden错误.

这是我的申请表: /var/www/myapp/code/

我不知道是什么给了...当我尝试将root更改为我的app/public目录时,我不断收到"403 Forbidden nginx/1.14.0".我甚至将/html文件夹移动到myapp目录中并加载"欢迎使用Nginx!" 那里的页面.我需要做些什么才能index.html.erb在我的应用程序视图中处理我的文件,或者,我是否需要在index.html没有任何内容的情况下进行自定义ERB

我的/ public目录中没有索引文件.我需要做什么才能让nginx指向我root_path在rails应用程序路由中定义的内容?

权限设置root rails为(工作)"欢迎使用Nginx!" 索引路径和myapp /代码/公共路径.

我很乐意帮助,谢谢!

/etc/nginx/sites-enabled/default(没有评论):

server {
    root /var/www/myapp/code/public;

    index index.html.erb index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;
    }

  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/transverseaudio.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/transverseaudio.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = www.transverseaudio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = transverseaudio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;
    return 404; # managed by Certbot

}
Run Code Online (Sandbox Code Playgroud)

我的/etc/nginx/sites-enabled/myapp.conf:

server {
  listen 80;
  server_name transverseaudio.com www.transverseaudio.com;

  # Tell Nginx and Passenger where your app's 'public' directory is
  root /var/www/myapp/code/public;

  # Turn on Passenger
  passenger_enabled on;
  passenger_ruby /usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby;
}
Run Code Online (Sandbox Code Playgroud)

我进一步研究了我的Ruby + Rails配置并验证了安装的正确版本:

Rails -v = Rails 5.2.0

Ruby -v = ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

Jon*_*han 2

您描述了旅途中的多个不同问题。让我们按照它们(应该)出现的顺序来处理它们。

默认页面

您已正确识别出该服务器正在为您的根目录提供/var/www/html默认主页。如果您不想授予 nginx 对该目录的读取权限,您可以尝试将 /var/www/html 符号链接到您应用程序的公共目录。实际问题是,您正在执行基于名称的托管,并且您的域名是在默认站点上配置的,而不是在 myapp.conf 上配置的。如果将默认列出的 server_name 移动到其中的 server_name 指令myapp.conf就足够了。

Passanger 也应该接受请求:

当 Passenger 处理请求时,Nginx 将首先尝试在 public 目录中查找匹配的文件,如果找到,将直接提供服务,而不将请求传递给您的应用程序,因为许多 Web 应用程序框架默认使用此目录来存储静态文件(例如 Rails、Sinatra)。对于机架应用程序,如何使乘客独立服务 .erb 文件的输出而不是发送 .erb 文件本身?

403 禁止

成功更改虚拟主机的根目录后,nginx 可能无法读取那里的数据。这可能是由于文件权限错误造成的,即运行 nginx 的用户无法读取目录/文件。

如果您没有索引文档并且目录索引被禁用,也会发生这种情况。您可以创建索引文档或添加一些重写规则。

500

如果您tail查看 nginx 的日志文件,它应该会为您提供错误消息的更多详细信息。500是服务器端错误,所以nginx至少应该给你一个提示。我认为这是因为您的服务器部分/文件中缺少。

# Turn on Passenger
passenger_enabled on;
passenger_ruby /usr/local/rvm/gems/ruby-2.3.0/wrappers/ruby;
Run Code Online (Sandbox Code Playgroud)

把它包起来

还要确保您include /etc/nginx/passenger.conf;的 nginx.conf 中有此内容。

所以总结一下,我建议删除默认值以摆脱它。

# redirect non https traffic for the correct domains
server {
    if ($host = www.transverseaudio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = transverseaudio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    return 404; # managed by Certbot

}

server {
  listen [::]:443 ssl ipv6only=on;
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/transverseaudio.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/transverseaudio.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  # server for these domains
  server_name transverseaudio.com www.transverseaudio.com;

  # first try to serve the erb version.
  index index.html;

  # Tell Nginx and Passenger where your app's 'public' directory is
  root /var/www/myapp/code/public;

  # Turn on Passenger
  passenger_enabled on;
  passenger_ruby /usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby;
}
Run Code Online (Sandbox Code Playgroud)