configuration基本身份validation后,Nginx会提供一个内部服务器错误500

我正在尝试对Nginx进行基本authentication。 我已经在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在/ etc(用户名“calvin”,密码“Calvin”,用户名“hobbes”,密码“Hobbes”)下的“users”文件中创build两个用户。 它是这样encryption的:

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

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

这一切工作正常,如果我注释掉两个身份validation行并重新启动nginx,但如果我取消注释他们,然后我确实得到用户名和密码提示,当我尝试加载该网站,但立即之后得到一个错误500内部服务器错误这似乎坚持,我不得不重新启动nginx。

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

当您使用MD5时,不是真正的答案。 然而,当这个线程在搜索错误时弹出,我将它附加到它。

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

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

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

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

目前的解决方案是使用md5生成一个新的密码,这是默认的。

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

md5肯定有问题,有些上下文可以在下面的线程中找到

  • MD5被认为是不安全的?
  • 对于单次使用认证,md5仍然被认为是安全的吗?

在这两个,速度问题可以通过使用fail2ban来缓解,通过禁止失败的基本身份验证,你会使网上暴力强制不切实际( 指导 )。 您也可以使用长密码来尝试和强化一点,如这里所建议的。

除此之外,看起来这个和nginx一样好…

最初创建用户时,我已经疯狂了。 结果,htpasswd文件如下所示:

 user: user:$apr1$passwdhashpasswdhashpasswdhash... 

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

我将自己将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; 但是第一个变体适合我

我只是遇到了同样的问题 – 在按照@Drazen Urch的建议检查日志之后,我发现这个文件具有root:root权限root:root权限 – 在更改为forge:forge (我正在使用数字海洋伪造)之后,问题就消失了。