在 Arch Linux 中使用“Nginx Web 服务器”创建虚拟主机、密码保护目录和 SSL 证书
之前的 Arch Linux ‘LEMP’ 文章只介绍了基本内容,从安装网络服务(Nginx、MySQL 数据库和 PhpMyAdmin)到配置 MySQL 服务器和 PhpMyadmin 所需的最低安全性。
本主题与之前在 Arch Linux 上安装 LEMP 密切相关,并将指导您为 LEMP 堆栈设置更复杂的配置,特别是 Nginx Web 服务器配置,例如创建虚拟主机 ,使用密码保护目录,创建和配置HTTP安全套接字层,HTTP不安全重定向到HTTPS,并且还将向您展示一些有用的Bash脚本将简化激活虚拟主机并生成SSL证书和密钥的工作。
要求
在 Arch Linux 中安装 LEMP 和 MariaDB 数据库
第 1 步:在 Nginx 上启用虚拟主机
启用虚拟主机的最简单方法之一是在主Nginx配置文件上使用include语句,这使得进一步配置的工作更加简单和高效,因为您可以创建简单的文件对于每个新主机并保持主配置文件更干净。
此方法的工作方式与 Apache Web Server 相同,您需要做的第一件事是指定 Nginx 应读取文件指令的新 URI 路径。
1. 因此,打开位于 /etc/nginx/ 系统路径底部的 nginx.conf 主文件,在最后一个大括号“之前}”添加未来虚拟主机配置文件所在的路径。
sudo nano /etc/nginx/nginx.conf
在底部添加以下语句。
include /etc/nginx/sites-enabled/*.conf;
该指令告诉 Nginx 它应该读取 /etc/nginx/sites-enabled/ 中以 .conf 扩展名结尾的所有文件。
2. 下一步是创建 sites-enabled 目录和另一个名为 sites-available 的目录,用于存储所有虚拟主机配置文件。
sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled
3.现在是时候创建一个新的虚拟主机了。此示例将使用系统 IP 地址作为虚拟主机名,因此创建一个名为 name-ip.conf 的新文件。
sudo nano /etc/nginx/sites-available/name-ip.conf
添加以下内容。
## File content ##
server {
listen 80;
server_name 192.168.1.33;
access_log /var/log/nginx/192.168.1.33.access.log;
error_log /var/log/nginx/192.168.1.33.error.log;
root /srv/http;
location / {
index index.html index.htm index.php;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
激活虚拟主机的指令是监听端口下的server_name语句。另外,这里的另一个重要指令是 root 语句,它指向 Nginx 虚拟主机从 /srv/http/ 系统路径提供文件内容。
4.最后一步是创建 /srv/http/ 目录并使 name-ip.conf 文件配置可供 Nginx 读取(使用符号链接),然后重新启动守护进程以使新配置可见。
sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx
5. 要验证它,请将浏览器指向 Arch 系统 IP 地址,您应该看到 Web 内容与 http://localhost 不同。在这里,我添加了一个小的 php 脚本,它还检查 FastCGI PHP 配置,如下面的屏幕截图所示。
sudo nano /srv/http/info.php
## File content ##
<?php
phpinfo();
?>
6.我自己开发的另一种在 Nginx 上启用或禁用虚拟主机的方法是一种更优雅的方法,它的灵感来自 Apache a2eniste 脚本。
要使用此方法,请打开文件编辑器并在 $HOME 路径上创建一个名为 n2ensite 的新文件,其中包含以下内容,使其可执行,并使用 root 权限运行它并作为选项传递给您的新虚拟主机名称,不带 .conf 结尾(可根据您的需要随意修改)。
sudo nano n2ensite
## File content ##
#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi
avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`
if [ "$#" != "1" ]; then
echo "Use script: n2ensite virtual_site"
echo -e "\nAvailable virtual hosts:\n$site"
exit 0
else
if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi
使其可执行并按所示运行。
sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host
7. 要禁用虚拟主机,请创建一个包含以下内容的新 n2dissite 文件,并应用与上述相同的设置。
sudo nano n2dissite
## File content ##
#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`
if [ "$#" != "1" ]; then
echo "Use script: n2dissite virtual_site"
echo -e "\nAvailable virtual hosts: \n$site"
exit 0
else
if test -e $avail; then
sudo rm $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi
8. 现在您可以使用这两个脚本来启用或禁用任何虚拟主机,但如果您想将其应用为系统范围命令,只需将这两个脚本复制到 /usr/local/bin/ 然后就可以使用它而无需指定路径。
sudo cp n2ensite n2dissite /usr/local/bin/
步骤 2:在 Nginx 上为虚拟主机启用 SSL
SSL(安全套接字层)是一种协议,旨在对网络或 Internet 上的 HTTP 连接进行加密,使数据流使用对称/非对称加密密钥在安全通道上传输在 Arch Linux 中由 OpenSSL 包提供。
sudo pacman -S openssl
9. 要启用与 Nginx 的 HTTPS 连接,您首先需要做的是生成虚拟主机密钥。另外,为了简化事情,我开发了一个小脚本,可以使用虚拟主机命名作为密钥名称,在 /etc/nginx/ssl 目录路径上自动生成加密密钥。
创建名为 nginx_gen_ssl 的文件并添加以下内容。
sudo nano nginx_gen_ssl
## File content ##
#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx SSL certificate!"
read cert
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt
echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0
10. 创建脚本后附加执行权限,运行它并提供您的证书选项,其中最重要的一个是Common Name字段(在此处添加官方域名)和将密码和可选公司字段留空。
sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl
在密钥生成任务结束时,将显示 Nginx ssl 目录下所有可用密钥的列表。
另外,如果您希望将此脚本用作系统命令,请将其复制或移动到 /usr/local/bin/。
sudo mv nginx_gen_ssl /usr/local/bin
11. 在我们生成 Nginx SSL 虚拟主机所需的密钥后,就可以实际创建 SSL 虚拟主机配置文件了。在 server_name 指令上为虚拟主机使用相同的系统 IP 地址,但通过在 .conf 之前附加 ssl 来稍微更改虚拟主机文件名,以提醒您此文件代表 name-ip SSL 虚拟主机。
sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf
在此文件中,将 listen 端口语句更改为 443 ssl,并提供 SSL 和证书密钥文件路径以及之前创建的路径,如下面的摘录所示。
## File content ##
server {
listen 443 ssl;
server_name 192.168.1.33;
ssl_certificate /etc/nginx/ssl/192.168.1.33.crt;
ssl_certificate_key /etc/nginx/ssl/192.168.1.33.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/192.168.1.33-ssl.access.log;
error_log /var/log/nginx/192.168.1.33-ssl.error.log;
root /srv/http;
location / {
index index.html index.htm index.php;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
12. 文件创建后,使用 n2ensite 脚本或 ln 命令行激活它(在 sites 中创建文件符号链接-enabled 目录),然后重新启动 Nginx 守护进程以应用设置。
sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx
13. 再次将浏览器指向 Arch IP URL,但这次使用 HTTPS 协议 - 在我的系统上 https://192.168.1.33 - 并且应出现连接不受信任安全错误(添加并确认安全异常以进一步查看页面)。
现在您可以看到,您的 Nginx 虚拟主机提供与之前的 name-ip 主机相同的内容,但这次使用 HTTP 安全连接。
第三步:通过虚拟主机访问PhpMyAdmin
如果在 Nginx 上启用了虚拟主机,我们将无法再访问 http://localhost 路径内容(如果没有另外配置,localhost 通常使用环回 IP 地址或系统 IP 地址来提供内容),因为我们有使用 Arch 系统 IP 作为 server_name,因此我们的内容路径已更改。
14. 通过 Web 访问 PhpMyAdmin 的最简单方法是在 /usr/share/webapps/phpMyAdmin/ 路径之间创建符号链接以及我们新定义的虚拟主机路径 (/srv/http)。
sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/
15. 执行完上述命令后,刷新页面,如果 Nginx 虚拟主机上启用了 autoindex 语句或直接将 URL 指向,您将看到一个新文件夹 phpMyAdmin 出现PhpMyAdmin 文件夹 https://arch_IP/phpMyAdmin。
16. 如果您想清理浏览器上的 phpMyAdmin 字符串,请编辑您的虚拟主机文件并在服务器块下添加以下内容。
location /phpmyadmin {
rewrite ^/* /phpMyAdmin last;
}
步骤 4:在 Nginx 上启用密码保护目录
与 Apache 不同,Nginx 使用 HttpAuthBasic 模块来启用密码保护目录,但不提供任何工具来创建加密的 .htpasswd 文件。
17. 要在 Arch Linux 上使用 Nginx 实现目录密码保护,请安装 Apache Web 服务器并使用其工具生成加密的 .htaccess 文件。
sudo pacman -S apache
18. 安装 Apache 后,在 /etc/nginx/ 下创建一个新目录,直观地命名为 passwd,其中将存储并使用 .htpasswd 文件htpasswd 命令与 –c 打开第一个添加的用户来生成文件,然后如果您想添加更多用户,请使用不带 – 的 htpasswd c 开关。
sudo mkdir /etc/nginx/passwd
sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user
19.为了保护name-ip-ssl虚拟主机根/srv/http/服务路径及其下的所有子文件夹和文件它将以下指令添加到 root 指令下的虚拟主机服务器块中,并将其指向绝对 .htpasswd 文件路径。
auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;
20. 重新启动 Nginx 服务后,刷新页面并显示需要身份验证弹出窗口,要求您提供凭据。
现在您已成功启用 Nginx 密码保护目录,但请注意,同时 Apache Web 服务器已安装在您的系统中,因此请确保它保持禁用状态,并且无论如何都不要启动它,因为可能会导致端口与 Nginx 冲突。
步骤 5:在 Nginx 上将 HTTP 重定向到 HTTPS
21.如果您希望浏览器自动将所有不安全的 HTTP 请求重定向到 HTTPS 协议,请打开并编辑您的非 ssl 虚拟主机,并在 server_name 指令。
rewrite ^ https://$server_name$request_uri? permanent;
本文中介绍的所有设置都是在充当服务器的 Arch Linux 系统下进行的,但其中大多数设置,尤其是有关 Nginx 配置文件的设置,在大多数 Linux 系统上都可用,但略有不同。