如何使用虚拟主机和SSL证书安装Nginx

本文介绍如何使用基于名称的虚拟主机和SSL安装Nginx以进行安全数据传输,包括Ubuntu和CentOS上的自签名证书。

NginxEngine-x的缩写)是一个免费的,开源的,功能强大,高性能且可扩展的HTTP和反向代理服务器,邮件和标准TCP / UDP代理服务器。 它易于使用和配置,使用简单的配置语言。 由于其可扩展性和性能,Nginx现在是用于为负载较重的站点供电的首选Web服务器软件。

在本文中将讨论如何将Nginx用作HTTP服务器,将其配置为提供Web内容,以及设置基于名称的虚拟主机,以及为安全数据传输创建和安装SSL,包括Ubuntu和CentOS上的自签名证书。

如何安装Nginx Web Server

首先,使用您的软件包管理器从官方存储库安装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 senable nginx
$ sudo systemctl status nginx
启动并检查Nginx状态

启动并检查Nginx状态

此时,Nginx Web服务器应该已启动并运行,您可以使用netstat命令验证状态。

$ sudo netstat -tlpn | grep nginx
检查Nginx端口状态

检查Nginx端口状态

如果您的系统启用了防火墙,则需要打开端口80443以分别通过它运行HTTPHTTPS流量。

------------ 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网页

检查Nginx网页

如何配置Nginx Web服务器

Nginx的配置文件位于/etc/nginx目录中,全局配置文件位于CentOS和Ubuntu上的/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在哪里可以找到网站配置文件(虚拟主机配置)。

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 / stores符号链接到在/中创建的网站配置文件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将为其提供网页和其他文档的目录。
  • index :指定要提供的索引文件的类型。
  • location :用于处理特定文件和文件夹的请求。

在Web浏览器中,当您使用主机名 localhost或其IP地址指向服务器时,它会处理请求并提供文件/var/www/html/index.html ,并立即将事件保存到其访问日志中( / var / log / nginx / access.log ), 响应200(OK) 如果出现错误(事件失败),它会在错误日志( /var/log/nginx/error.log )中记录该消息。

测试Nginx默认站点

测试Nginx默认站点

要了解有关登录Nginx的更多信息,可以参考如何Nginx 中配置自定义访问或错误日志格式

您可以为不同的网站定义自定义日志文件,而不是使用默认日志文件,我们稍后将在“ 设置基于名称的虚拟主机(服务器块) ”部分中进行介绍。

如何使用Nginx限制对网页的访问

为了限制对您的网站/应用程序或其某些部分的访问,您可以设置基本的HTTP身份验证 这主要用于限制对整个HTTP服务器,单个服务器块或位置块的访问。

首先创建一个文件,使用htpasswd实用程序存储您的访问凭据( 用户名/密码 )。

 
$ yum install httpd-tools		#RHEL/CentOS
$ sudo apt install apache2-utils	#Debian/Ubuntu

例如,让我们将用户管理员添加到此列表中(您可以添加尽可能多的用户),其中-c选项用于指定密码文件, -B用于加密密码。 点击[Enter]后 ,系统会要求您输入用户密码:

$ sudo htpasswd -Bc /etc/nginx/conf.d/.htpasswd admin

然后,让我们为密码文件分配适当的权限和所有权(用Ubuntu上的www-data替换用户和组nginx)。

$ sudo chmod 640 /etc/nginx/conf.d/.htpasswd
$ sudo chmod  nginx:nginx /etc/nginx/conf.d/.htpasswd

正如我们之前提到的,您可以限制对Web服务器,单个网站(使用其服务器块)或特定目录或文件的访问。 可以使用两个有用的指令来实现此目的:

  • 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 Authorization Required ”错误。

如何在Nginx中设置基于名称的虚拟主机(服务器块)

服务器上下文允许多个域/站点存储在同一物理机或虚拟专用服务器(VPS)中并由其提供服务。 可以在每个站点/域的http上下文中声明多个服务器块(表示虚拟主机)。 Nginx根据收到的请求标头决定哪个服务器处理请求。

我们将使用以下虚拟域来演示此概念,每个虚拟域位于指定的目录中:

  • wearehowtoing.com - /var/www/html/wearehowtoing.com/
  • welovelinux.com - /var/www/html/welovelinux.com/

接下来,为每个站点的目录分配适当的权限。

$ sudo chmod -R 755 /var/www/html/wearehowtoing.com/public_html 
$ sudo chmod -R 755 /var/www/html/welovelinux.com/public_html 

现在,在每个public_html目录中创建一个示例index.html文件。

<html>
	<head>
		<title>www.wearehowtoing.com</title>
	</head>
<body>
	<h1>This is the index page of www.wearehowtoing.com</h1>
</body>
</html>

接下来,为/etc/httpd/conf.d目录中的每个站点创建服务器块配置文件。

$ sudo vi /etc/nginx/conf.d/wearehowtoing.com.conf
$ sudo vi /etc/nginx/conf.d/welovelinux.com.conf

wearehowtoing.com.conf文件中添加以下服务器块声明。

wearehowtoing.com.conf
server {
    listen         80;
    server_name  wearehowtoing.com;
    root           /var/www/html/wearehowtoing.com/public_html ;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
}

接下来,在welovelinux.com.conf文件中添加以下服务器块声明。

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

并将您的Web服务器指向上述地址应该会让您看到虚拟域的主页。

http://wearehowtoing.com
http://welovelinux.com
测试Nginx虚拟主机网站

测试Nginx虚拟主机网站

重要提示 :如果启用了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/httpd/ssl-certs/apache.key - 指定RSA密钥的完整路径。
  • -out /etc/httpd/ssl-certs/apache.crt - 指定证书的完整路径。
为Nginx创建SSL证书和密钥

为Nginx创建SSL证书和密钥

接下来,打开虚拟主机配置文件,并将以下行添加到监听端口443的服务器块声明中。 我们将使用虚拟主机文件/etc/nginx/conf.d/wearehowtoing.com.conf进行测试。

$ sudo vi /etc/nginx/conf.d/wearehowtoing.com.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  wearehowtoing.com;
    root           /var/www/html/wearehowtoing.com/public_html;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }

}

现在重新启动Nginx并将浏览器指向以下地址。

https://www.wearehowtoing.com
检查Nginx SSL网站

检查Nginx SSL网站

如果您想从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安装/配置过程中遇到任何挫折或有任何问题或意见,请使用下面的反馈表联系我们。


分享按钮