配置基本身份验证后,Nginx会出现内部服务器错误500

时间:2015-08-05 13:12:28

标签: nginx

我正在尝试在Nginx上进行基本身份验证。我在Ubuntu 14.04上启动并运行1.9.3版,它可以在一个简单的html文件中正常工作。

这是html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  "Some shoddy text"
</body>
</html>

这是我的nginx.conf文件:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    server {
        listen 80;
        server_name 192.168.1.30;
        location / {
            root /www;
            index index.html;
            auth_basic "Restricted";
            auth_basic_user_file /etc/users;
        }
    }
}

我使用htpasswd在&#34;用户&#34;中创建了两个用户。 / etc下的文件(用户名&#34; calvin&#34;密码&#34; Calvin&#34;和用户名&#34; hobbes&#34;密码&#34; Hobbes&#34;)。它的加密方式如下:

calvin:$apr1$Q8LGMfGw$RbO.cG4R1riIfERU/175q0
hobbes:$apr1$M9KoUUhh$ayGd8bqqlN989ghWdTP4r/

所有文件都属于root:root。服务器IP地址是192.168.1.30,我直接在conf文件中引用它。

如果我注释掉两个auth行并重新启动nginx,一切正常,但是如果我取消注释它们,那么当我尝试加载站点时,我的确会得到用户名和密码提示,但此后立即获得错误500内部服务器错误似乎仍然存在,我必须重新启动nginx。

任何人都可以看到我在这里做错了什么?我在标准的Ubuntu 14.04 apt-get版本的Nginx(1.4.something)上有相同的行为,所以我不认为它是nginx版本。

11 个答案:

答案 0 :(得分:30)

当您使用MD5时,不是您的问题的答案。但是,当搜索错误时弹出此线程,我将其附加到它。

使用bcrypt生成auth_basic的密码时会发生类似错误:

htpasswd -B <file> <user> <pass>

由于bcrypt ATM中不支持auth_basic,因此可以在nginx error.log中找到神秘的500错误(通常位于/var/log/nginx/error.log),它们看起来像这样:< / p>

*1 crypt_r() failed (22: Invalid argument), ...

目前解决方案是使用md5生成一个新密码,无论如何都是默认密码。

编辑以解决由@EricWolf在评论中提出的md5问题:

md5 肯定存在问题,可以在以下主题中找到一些上下文

在这两者中,使用fail2ban可以减轻速度问题,通过禁止失败的基本身份验证,您将使在线暴力行为变得不切实际(guide)。您还可以使用长密码尝试按照建议here进行强化。

除此之外,它似乎与nginx一样好......

答案 1 :(得分:7)

最初创建用户时我已经搞砸了。因此,htpasswd文件看起来像:

user:
user:$apr1$passwdhashpasswdhashpasswdhash...

删除空白用户后,一切正常。

答案 2 :(得分:2)

我将自己将htpassword文件粘贴在“/ etc / nginx”下。 假设它被命名为htcontrol,那么......

sudo htpasswd -c /etc/nginx/htcontrol calvin

按照提示输入密码,文件将在正确的位置。

location / {
    ...

    auth_basic "Restricted";
    auth_basic_user_file htcontrol;
}

auth_basic_user_file /etc/nginx/htcontrol;,但第一个版本适用于我

答案 3 :(得分:2)

我在Docker环境中运行Nginx,遇到同样的问题。原因是某些密码是使用bcrypt生成的。我使用nginx:alpine解决了这个问题。

答案 4 :(得分:1)

我遇到了同样的问题 - 按照@Drazen Urch建议检查日志后我发现该文件具有$('#btn').click(function () { $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: "http://x.x.x.x:xxxx/app/x/" + $("#xcoord").val() + '/y/' + $("#ycoord").val(), dataType: "json", success: function (data) { alert(data); } }); }); 权限 - 更改为root:root后(我正在使用Forge with Digital海洋) - 问题消失了。

答案 5 :(得分:1)

在设置kibana身份验证时,我也面临着同样的问题。这是我的/var/log/nginx/error.log文件中的错误

2020/04/13 13:43:08 [crit] 49662#49662:* 152 crypt_r()失败(22: 参数无效),客户端:157.42.72.240,服务器:168.16.168.150, 请求:“ GET / HTTP / 1.1”,主机:“ 168.61.168.150”

我通过使用此方法添加身份验证解决了这个问题。

sudo sh -c "echo -n 'kibanaadmin:' >> /etc/nginx/htpasswd.users"
sudo sh -c "openssl passwd -apr1 >> /etc/nginx/htpasswd.users"

如果您尝试设置kibana并遇到此问题,可以参考这篇文章。

https://medium.com/@shubham.singh98/log-monitoring-with-elk-stack-c5de72f0a822?postPublishedType=repub

答案 6 :(得分:1)

是否要使用Nginx basic_auth进行更多安全的密码哈希处理?这样做:

echo "username:"$(mkpasswd -m sha-512) >> .htpasswd

SHA-512几乎不如bcrypt优秀,但它是目前nginx支持的最佳方式。

答案 7 :(得分:0)

好吧,只需使用正确的RFC 2307语法:

passwordvalue          = schemeprefix encryptedpassword
schemeprefix           = "{" scheme "}"
scheme                 = "crypt" / "md5" / "sha" / altscheme
altscheme              = "x-" keystring
encryptedpassword      = encrypted password

例如:helloworld的{​​1}的sha1将是 * admin

我遇到了同样的错误,原因是我写了admin:{SHA}at+xg6SiyUovktq1redipHiJpaE=违反RFC语法的内容。当我修复它时-一切都像魅力一样。 {SHA1}也不起作用。仅正确{sha}

答案 8 :(得分:0)

首先,检查您的nginx错误日志:

tail -f /var/log/nginx/error.log

对于我来说,我发现了错误:

[crit] 18901#18901: *6847 open() "/root/temp/.htpasswd" failed (13: Permission denied),

/root/temp目录是我的测试目录之一,nginx无法读取。将其更改为/etc/apache2/后(遵循官方指南https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/),一切正常。

===

执行ps命令后,我们可以看到用户www-data维护的nginx worker进程,我曾尝试chown www-data:www-data /root/temp以确保www-data可以访问此文件,但仍然无法正常工作。老实说,我对Linux文件权限没有很深入的了解,因此最终将其更改为/etc/apache2/来解决此问题。经过测试后,您可以将.htpasswd文件放在/etc(例如/etc/nginx)中的其他目录中。

enter image description here

答案 9 :(得分:0)

就我而言,我使用的是-p标志的纯文本密码,巧合的是,我的密码以$字符开头。 所以我更新了密码,因此错误消失了。

NB:其他人的回答对我找出问题有很大帮助。如果有人遇到像我这样的罕见情况,我会在这里发布我的解决方案。

答案 10 :(得分:0)

就我而言,我进行了auth_basic设置,以保护由proxy_pass配置提供服务的nginx位置。

配置的proxy_pass位置未返回成功的HTTP200响应,这导致nginx在输入正确的用户名和密码后以内部服务器错误响应。

如果您使用类似的设置,请在排除用户名/密码问题之后,确保受proxy_pass保护的auth_basic位置返回HTTP200响应。