如何使用虚拟主机和 SSL 证书安装 Nginx
Nginx(Engine-x的缩写)是一个免费、开源、功能强大、高性能和可扩展的HTTP和反向代理服务器,是一个邮件和标准TCP/UDP代理服务器。它易于使用和配置,配置语言简单。由于其可扩展性和性能,Nginx 现在是为负载较重的站点提供支持的首选 Web 服务器软件。
本文将讨论如何使用 Nginx 作为 HTTP 服务器,将其配置为提供 Web 内容,设置基于名称的虚拟主机,以及创建和安装 SSL 以实现安全数据传输,包括 Ubuntu 和 CentOS 上的自签名证书。
如何安装 Nginx Web 服务器
首先使用包管理器从官方存储库安装 Nginx 包,如图所示。
------------ On Ubuntu ------------
sudo apt update
sudo apt install nginx
------------ On CentOS ------------
sudo yum update
sudo yum install epel-release
sudo yum install nginx
安装 Nginx 软件包后,您需要暂时启动该服务,使其在启动时自动启动并查看其状态,使用以下命令。请注意,在 Ubuntu 上,它应该在预配置软件包时自动启动并启用。
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
此时,Nginx Web 服务器应该已启动并正在运行,您可以使用 netstat 命令验证状态。
sudo netstat -tlpn | grep nginx
如果您的系统启用了防火墙,则需要打开端口 80 和 443 以允许 HTTP 和 HTTPS 流量分别通过它,通过运行。
------------ On CentOS ------------
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
------------ On Ubuntu ------------
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
测试 Nginx 安装并检查其是否正在运行并能够提供网页服务的理想方法是打开 Web 浏览器并指向服务器的 IP。
http://Your-IP-Address
OR
http://Your-Domain.com
以下屏幕应表明安装正常。
如何配置 Nginx Web 服务器
在 CentOS 和 Ubuntu 上,Nginx 的配置文件位于 /etc/nginx
目录中,全局配置文件位于 /etc/nginx/nginx.conf
中。
Nginx 由由各种配置选项(称为指令)控制的模块组成。 指令可以是简单的(以;
结尾的表单名称和值)或块(使用包含额外的指令{}
)。包含其他指令的块指令称为上下文。
所有指令都在项目网站的 Nginx 文档中进行了全面解释。您可以参考它以获取更多信息。
如何在独立模式下使用 Nginx 提供静态内容
在基础层面上,Nginx 可用于在独立模式下提供静态内容,例如 HTML 和媒体文件,其中仅使用默认服务器块(类似于未配置虚拟主机的 Apache)。
我们首先简要解释一下主配置文件中的配置结构。
sudo vim /etc/nginx/nginx.conf
如果您查看此 Nginx 配置文件,配置结构应如下所示,这称为主上下文,其中包含许多其他简单指令和块指令。所有 Web 流量都在 http 上下文中处理。
user nginx;
worker_processes 1;
.....
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
.....
events {
.....
}
http {
server{
…….
}
.....
}
以下是一个示例 Nginx 主配置(/etc/nginx/nginx.conf)文件,其中上面的 http 块包含一个 include 指令,该指令告诉 Nginx 在哪里可以找到网站配置文件(虚拟主机配置) 。
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
请注意,在 Ubuntu 上,您还会发现一个附加的包含指令 (include /etc/nginx/sites-enabled/*;),其中目录 /etc /nginx/sites-enabled/ 存储指向在 /etc/nginx/sites-available/ 中创建的网站配置文件的符号链接,以启用网站。删除符号链接会禁用该特定站点。
根据您的安装源,您将在 /etc/nginx/conf.d/default.conf 中找到默认网站配置文件(如果您从官方 NGINX 存储库安装)和 EPEL)或 /etc/nginx/sites-enabled/default (如果您从 Ubuntu 存储库安装)。
这是我们的示例默认 nginx 服务器块,位于测试系统上的 /etc/nginx/conf.d/default.conf 。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html/;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
对上述配置中指令的简要解释:
- listen:指定服务器监听的端口。
- server_name:定义服务器名称,可以是精确名称、通配符名称或正则表达式。
- root:指定 Nginx 将在其中提供网页和其他文档的目录。
- 索引:指定要提供的索引文件的类型。
- 位置:用于处理特定文件和文件夹的请求。
在 Web 浏览器中,当您使用主机名本地主机或其 IP 地址指向服务器时,它会处理请求并提供文件 /var/www/html/index.html,并立即将事件保存到其访问日志 (/var/log/nginx/access.log),并返回 200 (OK) 响应。如果发生错误(失败的事件),它会在错误日志(/var/log/nginx/error.log)中记录消息。
要了解有关 Nginx 登录的更多信息,您可以参考如何在 Nginx 中配置自定义访问或错误日志格式。
您可以为不同的网站定义自定义日志文件,而不是使用默认的日志文件,正如我们稍后将在“设置基于名称的虚拟主机(服务器块)”部分中看到的那样。
如何使用 Nginx 限制对网页的访问
为了限制对您的网站/应用程序或其某些部分的访问,您可以设置基本的 HTTP 身份验证。这本质上可用于限制对整个 HTTP 服务器、单个服务器块或位置块的访问。
首先使用 htpasswd 实用程序创建一个文件来存储您的访问凭据(用户名/密码)。
yum install httpd-tools #RHEL/CentOS
sudo apt install apache2-utils #Debian/Ubuntu
例如,我们将用户 admin 添加到此列表中(可以添加尽可能多的用户),其中 -c
选项用于指定密码文件,-B
对密码进行加密。点击[Enter]后,系统将要求您输入用户密码:
sudo htpasswd -Bc /etc/nginx/conf.d/.htpasswd admin
然后,我们为密码文件分配适当的权限和所有权(在 Ubuntu 上将用户和组 nginx 替换为 www-data)。
sudo chmod 640 /etc/nginx/conf.d/.htpasswd
sudo chown nginx:nginx /etc/nginx/conf.d/.htpasswd
正如我们之前提到的,您可以限制对网络服务器、单个网站(使用其服务器块)或特定目录或文件的访问。可以使用两个有用的指令来实现此目的:
- auth_basic – 使用“HTTP 基本身份验证”协议启用用户名和密码验证。
- auth_basic_user_file – 指定凭证的文件。
作为示例,我们将展示如何使用密码保护目录 /var/www/html/protected。
server {
listen 80 default_server;
server_name localhost;
root /var/www/html/;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /protected/ {
auth_basic "Restricted Access!";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}
}
现在,保存更改并重新启动 Nginx 服务。
sudo systemctl restart nginx
下次您将浏览器指向上述目录 (http://localhost/protected) 时,系统会要求您输入登录凭据(用户名 admin 和所选密码)。
成功登录允许您访问该目录的内容,否则您将收到“需要 401 授权”错误。
如何在 Nginx 中设置基于名称的虚拟主机(服务器块)
服务器上下文允许在同一台物理机或虚拟专用服务器 (VPS) 中存储多个域/站点并为其提供服务。可以在每个站点/域的 http 上下文中声明多个服务器块(代表虚拟主机)。 Nginx 根据收到的请求标头决定由哪个服务器处理请求。
我们将使用以下虚拟域来演示这个概念,每个虚拟域都位于指定的目录中:
- wearelinux-console.net – /var/www/html/wearelinux-console.net/
- welovelinux.com – /var/www/html/welovelinux.com/
接下来,为每个站点的目录分配适当的权限。
sudo chmod -R 755 /var/www/html/wearelinux-console.net/public_html
sudo chmod -R 755 /var/www/html/welovelinux.com/public_html
现在,在每个 public_html 目录中创建一个示例 index.html 文件。
<html>
<head>
<title>www.wearelinux-console.net</title>
</head>
<body>
<h1>This is the index page of www.wearelinux-console.net</h1>
</body>
</html>
接下来,为 /etc/httpd/conf.d 目录中的每个站点创建服务器块配置文件。
sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf
sudo vi /etc/nginx/conf.d/welovelinux.com.conf
在 wearelinux-console.net.conf 文件中添加以下服务器块声明。
server {
listen 80;
server_name wearelinux-console.net;
root /var/www/html/wearelinux-console.net/public_html ;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
接下来,在 welovelinux.com.conf 文件中添加以下服务器块声明。
server {
listen 80;
server_name welovelinux.com;
root /var/www/html/welovelinux.com/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
要应用最近的更改,请重新启动 Nginx Web 服务器。
sudo systemctl restart nginx
将您的网络服务器指向上述地址应该可以让您看到虚拟域的主页。
http://wearelinux-console.net
http://welovelinux.com
重要:如果您启用了 SELinux,其默认配置不允许 Nginx 访问已知授权位置之外的文件(例如/etc/nginx 用于配置,/var/log/nginx 用于日志,/var/www/html 用于网络文件等..) 。
您可以通过禁用 SELinux 或设置正确的安全上下文来处理此问题。有关更多信息,请参阅 Nginx Plus 网站上的指南:将 Nginx 和 Nginx Plus 与 SELinux 结合使用。
如何使用 Nginx 安装和配置 SSL
SSL 证书有助于在您的网站上启用安全 http (HTTPS),这对于通过加密以下信息在最终用户和您的服务器之间建立可信/安全连接至关重要:传输到您的网站、从您的网站传输或在您的网站内传输。
我们将介绍如何创建和安装自签名证书,以及如何生成证书签名请求 (CSR) 以从证书颁发机构 (CA) 获取 SSL 证书,与 Nginx 一起使用。
自签名证书可以免费创建,并且实际上非常适合用于测试目的和仅限内部 LAN 的服务。对于面向公众的服务器,强烈建议使用 CA 颁发的证书(例如 Let's Encrypt)来维护其真实性。
要创建自签名证书,首先创建一个用于存储证书的目录。
sudo mkdir /etc/nginx/ssl-certs/
然后使用 openssl 命令行工具生成自签名证书和密钥。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl-certs/nginx.key -out /etc/nginx/ssl-certs/nginx.crt
我们简单描述一下上面命令中使用的选项:
- req -X509 – 显示我们正在创建 x509 证书。
- -nodes (NO DES) – 表示“不加密密钥”。
- -days 365 – 指定证书的有效天数。
- -newkey rsa:2048 – 指定使用 RSA 算法生成的密钥应为 2048 位。
- -keyout /etc/nginx/ssl-certs/nginx.key – 指定 RSA 密钥的完整路径。
- -out /etc/nginx/ssl-certs/nginx.crt – 指定证书的完整路径。
接下来,打开虚拟主机配置文件并将以下行添加到侦听端口 443 的服务器块声明中。我们将使用虚拟主机文件/etc/nginx/conf.d/wearelinux-console.net.conf进行测试。
sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf
然后将 ssl 指令添加到 nginx 配置文件中,它应该类似于以下内容。
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl-certs/nginx.crt;
ssl_trusted_certificate /etc/nginx/ssl-certs/nginx.crt;
ssl_certificate_key /etc/nginx/ssl-certs/nginx.key;
server_name wearelinux-console.net;
root /var/www/html/wearelinux-console.net/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
现在重新启动 Nginx 并将浏览器指向以下地址。
https://www.wearelinux-console.net
如果您想从 CA 购买 SSL 证书,则需要生成证书签名请求 (CSR),如图所示。
sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/nginx/ssl-certs/example.com.key -out /etc/nginx/ssl-certs/example.com.csr
您还可以从现有私钥创建 CSR。
sudo openssl req -key /etc/nginx/ssl-certs/example.com.key -new -out /etc/nginx/ssl-certs/example.com.csr
然后,您需要将生成的CSR发送给CA以请求颁发CA签名的SSL证书。从 CA 收到证书后,您可以按如上所示进行配置。
另请阅读:保护、强化和提高 Nginx Web 服务器性能的终极指南
概括
在这篇文章中,我们解释了如何安装和配置Nginx;介绍了如何使用 SSL 设置基于名称的虚拟主机,以保护 Web 服务器和客户端之间的数据传输。
如果您在 nginx 安装/配置过程中遇到任何挫折或有任何问题或意见,请使用下面的反馈表与我们联系。