【问题标题】:Nginx with Let's encrypt "Welcome to Nginx" instead of rails appNginx 用 Let's 加密“Welcome to Nginx”而不是 rails app
【发布时间】:2018-12-22 21:37:57
【问题描述】:

我最近将我的 Ruby on Rails 应用程序部署到一个普通的 Ubuntu 16.04 DigitalOcean droplet 上,使用 Nginx、passenger 和 Let's encrypt。

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

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

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

这是我的应用程序所在的位置:/var/www/myapp/code/

我不知道是什么原因...当我尝试将根目录更改为我的应用程序的 /public 目录时,我不断收到“403 Forbidden nginx/1.14.0”。我什至将/html 文件夹移动到myapp 目录中,它会加载“欢迎使用Nginx!”页面也在那里。我需要做些什么来处理我的应用程序视图中的index.html.erb 文件,或者我是否需要在没有任何ERB 的情况下制作自定义index.html

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

两个(工作)的权限都设置为root rails “欢迎来到 Nginx!”索引路径和 myapp/code/public 路径。

我很想得到一些帮助,谢谢!

我的/etc/nginx/sites-enabled/default(没有 cmets):

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

}

我的/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;
}

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

Rails -v = Rails 5.2.0

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

【问题讨论】:

  • 听起来像是 Nginx 的问题。能否请您分享更多的Nginx配置,即服务器属性配置?
  • @HatzavWolff 感谢您提出这些问题,我用配置文件更新了我的问题。
  • @Jake 请在安装 Let's Encrypt 之前显示您的 nginx 配置。您的 /etc/nginx/sites-enabled/default 中有 Certbot 的设置,它是 Let's Encrypt 的一部分。因此,当网站根据需要运行时,在 Let's Encrypt 之前看到它的版本会很棒。
  • @AlexanderUshakov 感谢您指出这一点,因为我没有使用版本控制,所以我重新制作了服务器,我的网站在没有 Let's Encrypt 的情况下运行。这是文件中没有 cmets 的 pastebin

标签: ubuntu nginx passenger digital-ocean lets-encrypt


【解决方案1】:

通常,在使用 Nginx 时,您不应该有多个具有相同 server_name 的服务器指令。只需删除 /etc/nginx/sites-enabled/default 文件。没用。

将您的 /etc/nginx/sites-enabled/myapp.conf 升级到类似这样的内容:

server {

  listen 80;
  listen 443 ssl;

  server_name transverseaudio.com www.transverseaudio.com;

  ssl_certificate /etc/letsencrypt/live/transverseaudio.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/transverseaudio.com/privkey.pem;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

  # 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.3.0/wrappers/ruby;
}

替代方法是将您的 myapp.conf 内容移动到 /etc/nginx/sites-enabled/default 的第一个服务器指令并删除 myapp.conf

【讨论】:

  • 你也可以加include /etc/letsencrypt/options-ssl-nginx.conf;,但是我看不到里面有什么。
  • 这只是摆脱了https:// 功能。它可以工作,但只有根域(即没有http/https)和www. 子域只是指向“欢迎使用Nginx”
  • 你能显示nginx -c /etc/nginx/nginx.conf -T的输出吗?
  • 当然,我把它都放到了这个Pastebin中。我等了一段时间,现在它给了我一个页面,上面写着:“500 Internal Server Error nginx/1.14.0” - httphttps 现在正在工作,只是它们都出现了这些错误。
  • 你在这个目录/etc/letsencrypt/live/transverseaudio.com/有证书吗?
【解决方案2】:

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

默认页面

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

Passanger 也应该接受请求:

当Passenger处理一个请求时,Nginx会首先尝试在公共目录中找到一个匹配的文件,如果找到了会直接提供它而不将请求传递给你的应用程序,因为许多Web应用程序框架使用这个目录来存储静态文件默认情况下(例如 Rails、Sinatra)。来自For a rack app, how do I make passenger-standalone serve the output of .erb files rather of sending the .erb file itself?

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;

总结

还要确保您的 nginx.conf 中有 include /etc/nginx/passenger.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;
}

【讨论】:

  • 我将server_name 更改为myapp.conf 而不是我的域名,我还将root 更改为我的应用程序公共目录。我现在得到一个 403 禁止。我可能误解了你的建议。如果我只是将 myapp 目录更改为我的域名会更好吗?另外,日志尾只是告诉我directory index of "/var/www/myapp/code/public/" is forbidden
  • 当“欢迎使用 Nginx!”时,权限怎么会出错?页面可见并且我所做的编辑正在域上更新? HTML 目录与我所看到的公共目录具有相同的权限。
  • 我需要在我的公共目录中明确地有一个索引文件吗?
  • 我已经更新了答案。请看看这是否对您有帮助。
  • 我将 myapp.conf 中的 server_name 更改为上面看到的两个域名,现在我得到:nginx: [warn] conflicting server name "transverseaudio.com" on 0.0.0.0:80, ignored 用于根域和 www。子域。我还将我的 nginx 索引移动到公共目录中,它工作正常。我只是不知道我需要做什么才能加载我的 Rails 应用程序索引而不是“欢迎使用 Nginx!”。
【解决方案3】:

在我的情况下(使用 DigitalOcean,安装 CertBot 后)我只需要更改 nginx/sites-enabled/default

root var/www/html 更正路径。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2017-08-23
    • 2018-10-21
    • 1970-01-01
    • 2018-06-23
    • 2019-09-09
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多