如何在 Ubuntu 14.04 上使用 Nginx 设置密码验证
介绍
设置 Web 服务器时,通常会有您希望限制访问的站点部分。 Web 应用程序通常提供自己的身份验证和授权方法,但如果这些方法不充分或不可用,Web 服务器本身可用于限制访问。
在本指南中,我们将演示如何在 Ubuntu 14.04 上运行的 Nginx Web 服务器上使用密码保护资产。
先决条件
首先,您需要访问 Ubuntu 14.04 服务器环境。您将需要具有 sudo
权限的非根用户才能执行管理任务。要了解如何创建这样的用户,请遵循我们的 Ubuntu 14.04 初始服务器设置指南。
如果您还没有这样做,请在您的机器上输入以下命令安装 Nginx:
- sudo apt-get update
- sudo apt-get install nginx
创建密码文件
首先,我们需要创建一个文件来保存我们的用户名和密码组合。您可以使用您的服务器上可能已经可用的 OpenSSL 实用程序来执行此操作。或者,您可以使用 apache2-utils
包中包含的专用 htpasswd
实用程序(Nginx 密码文件使用与 Apache 相同的格式)。从下面选择您最喜欢的方法。
使用 OpenSSL 实用程序创建密码文件
如果您的服务器上安装了 OpenSSL,您可以创建一个没有附加包的密码文件。我们将在 /etc/nginx
配置目录中创建一个名为 .htpasswd
的隐藏文件来存储我们的用户名和密码组合。
您可以使用此命令将用户名添加到文件中。我们使用 sammy
作为我们的用户名,但您可以使用任何您喜欢的名称:
- sudo sh -c "echo -n 'sammy:' >> /etc/nginx/.htpasswd"
接下来,通过键入以下内容为用户名添加加密密码条目:
- sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"
您可以为其他用户名重复此过程。您可以通过键入以下内容来查看用户名和加密密码是如何存储在文件中的:
- cat /etc/nginx/.htpasswd
Outputsammy:$apr1$wI1/T0nB$jEKuTJHkTOOWkopnXqC1d1
使用 Apache 实用程序创建密码文件
虽然 OpenSSL 可以为 Nginx 身份验证加密密码,但许多用户发现使用专用实用程序更容易。 apache2-utils
包中的 htpasswd
实用程序很好地提供了此功能。
通过键入以下命令在您的服务器上安装 apache2-utils
包:
- sudo apt-get update
- sudo apt-get install apache2-utils
现在,您可以访问 htpasswd
命令。我们可以使用它来创建 Nginx 可以用来对用户进行身份验证的密码文件。为此,我们将在我们的 /etc/nginx
配置目录中创建一个名为 .htpasswd
的隐藏文件。
我们第一次使用这个实用程序时,我们需要添加 -c
选项来创建指定的文件。我们在命令末尾指定一个用户名(本例中为 sammy
)以在文件中创建一个新条目:
- sudo htpasswd -c /etc/nginx/.htpasswd sammy
您将被要求提供并确认用户密码。
对于您希望添加的任何其他用户,省略 -c
参数:
- sudo htpasswd /etc/nginx/.htpasswd another_user
如果我们查看文件的内容,我们可以看到每条记录的用户名和加密后的密码:
- cat /etc/nginx/.htpasswd
Outputsammy:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.
配置 Nginx 密码验证
现在我们有了一个 Nginx 可以读取格式的包含我们的用户和密码的文件,我们需要配置 Nginx 在提供我们受保护的内容之前检查这个文件。
首先打开要添加限制的服务器块配置文件。对于我们的示例,我们将使用通过 Ubuntu 的 Nginx 包安装的 default
服务器块文件:
- sudo nano /etc/nginx/sites-enabled/default
在内部,删除注释后,文件应类似于以下内容:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
}
要设置身份验证,您需要决定要限制的上下文。在其他选择中,Nginx 允许您在服务器级别或特定位置内设置限制。在我们的示例中,我们将使用位置块限制整个文档根目录,但您可以修改此列表以仅针对网络空间中的特定目录:
在此位置块中,使用 auth_basic
指令打开身份验证并选择在提示输入凭据时向用户显示的域名。我们将使用 auth_basic_user_file
指令将 Nginx 指向我们创建的密码文件:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
完成后保存并关闭文件。重新启动 Nginx 以实施您的密码策略:
- sudo service nginx restart
您指定的目录现在应该受密码保护。
确认密码认证
要确认您的内容受到保护,请尝试在 Web 浏览器中访问您的受限内容。您应该看到如下所示的用户名和密码提示:

如果输入正确的凭据,您将被允许访问内容。如果输入错误的凭据或点击“取消”,您将看到“需要授权”错误页面:

结论
您现在应该拥有为站点设置基本身份验证所需的一切。请记住,密码保护应与 SSL 加密相结合,这样您的凭据就不会以明文形式发送到服务器。要了解如何创建用于 Nginx 的自签名 SSL 证书,请遵循本指南。