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

Tho*_*wne 11 nginx

我想在Nginx上做基本的auth.我在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>
Run Code Online (Sandbox Code Playgroud)

这是我的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用htpasswd在/ etc下的"users"文件中创建了两个用户(用户名"calvin"密码"Calvin",用户名"hobbes"密码"Hobbes").它的加密方式如下:

calvin:$apr1$Q8LGMfGw$RbO.cG4R1riIfERU/175q0
hobbes:$apr1$M9KoUUhh$ayGd8bqqlN989ghWdTP4r/
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dra*_*rch 35

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

bcrypt用于生成以下密码时会发生类似错误auth_basic:

htpasswd -B <file> <user> <pass>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

md5确实存在问题,可以在以下线程中找到一些上下文

在这两个中,速度问题可以通过使用fail2ban来缓解,通过禁止失败的基本身份验证,你将使在线暴力迫使不切实际(指南).您也可以使用长密码尝试强化一点,如此处所示.

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

  • 这个答案不太对。nginx 推迟支持 crypt_r,它是 libc 的一部分。如果操作系统附带的 libc 版本不支持 bcrypt,那么您将看到此错误消息。 (3认同)

小智 11

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

user:
user:$apr1$passwdhashpasswdhashpasswdhash...
Run Code Online (Sandbox Code Playgroud)

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

  • 我有完全一样的问题!我希望该错误消息更具描述性。 (2认同)

The*_*ith 6

您想要使用 nginx basic_auth 获得更安全的密码哈希吗?做这个:

echo "username:"$(mkpasswd -m sha-512) >> .htpasswd
Run Code Online (Sandbox Code Playgroud)

SHA-512 被认为不如 bcrypt 好,但它是目前 nginx 支持的最好的。


Ata*_* E. 5

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


Day*_*ayo 3

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

sudo htpasswd -c /etc/nginx/htcontrol calvin

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

location / {
    ...

    auth_basic "Restricted";
    auth_basic_user_file htcontrol;
}
Run Code Online (Sandbox Code Playgroud)

或者auth_basic_user_file /etc/nginx/htcontrol;但第一个变体对我有用