如何在 Ubuntu 上安装 Nginx 服务 - 实现多站点、多域名托管

A kitten
蒋川
B 端产品经理,卡拉云联合创始人
阅读时长 2 分钟

如何在 Ubuntu 上安装 Nginx 服务

Nginx 是全球占有率最大,使用最广泛的 Web Server,甚至一些流量巨大的网站也托管在 Nginx 之上。相对于 Apache 来说,Nginx 更轻量。也可使用 Nginx 作为 Web Server 或反向代理来使用。

本文是卡拉云系列教程,我们会详细讲解如何在 Ubuntu 服务器上安装 Nginx,配置防火墙、管理 Nginx 进程,以及如何使用一台服务器托管多个网站 / 域名。

先决条件

  • 一台已经配置好的 Ubuntu 服务器
  • 有这台服务器的 root 账号权限

第 1 步 - 安装 Nginx

因为 Nginx 在 Ubuntu 的默认存储库中可用,所以可以使用apt打包系统从这些存储库安装它。

由于这是我们apt在本次会议中与包装系统的第一次交互,我们将更新我们的本地包裹索引,以便我们可以访问最新的包裹列表。之后,我们可以安装nginx

Nginx 可在 Ubuntu 的软件源中获取,我们可以使用 apt 方式来安装 Nginx

首先,先更新 apt 列表:

sudo apt update

update

然后,执行 apt 命令,安装 nginx

sudo apt install nginx

之后,apt 会自动将 nginx 安装到你的服务器中

nginx

第 2 步:配置防火墙,允许 Nginx 服务通讯

在测试 Nginx 之前,需要调整防火墙软件以允许访问该服务。Nginxufw在安装时将自己注册为一个服务,这使得允许 Nginx 访问变得简单。

ufw通过键入以下内容列出知道如何使用的应用程序配置:

我们需要调整服务器中的防火墙,允许 Nginx 与外界通信。

首先,我们先查看 ufw 防火墙的配置列表:

sudo ufw app list

返回配置列表的数据:

ufw-app-list

如上图所示,与 Nginx 有关的三个可用的配置文件:

  • Nginx Full:此配置文件同时打开端口 80(正常、未加密的网络流量)和端口 443(TLS/SSL 加密流量)
  • Nginx HTTP:此配置文件仅打开端口 80(正常、未加密的网络流量)
  • Nginx HTTPS:此配置文件仅打开端口 443(TLS/SSL 加密流量)

我们选择 Nginx HTTP 配置文件,允许 80 端口通讯:

sudo ufw allow 'Nginx HTTP'

Nginx-HTTP

接着,我们来查看一下 ufw 的状态

sudo ufw status

ufw-status

可以看到 Nginx HTTP 80端口以打开。

特别提示:为什么 service ufw status 显示 active,而 ufw status 却显示的是 inactive

这个前者是 service 本身,而后者是 ufw 规则,启动服务,还得启动规则。

启动规则可用:

sudo ufw enable

第 3 步:检查 Web 服务器

在安装过程结束时,Ubuntu 服务器就会启动 Nginx。我们可以使用systemd命令来查看 Nginx 运行状态:

systemctl status nginx

如服务已启动,返回信息为:

status-nginx

特别提示:如显示没有启动,可尝试重启服务器。

status-nginx-not

现在,直接在浏览器输入服务器本机 IP 地址即可访问 Nginx 登录页面。如果你不知道本地服务器 IP 地址,可使用 icanhazip.com 工具来查看。

curl -4 icanhazip.com

在地址栏输入刚刚获取的 IP 地址:

http://your_server_ip

然后,你就能看到浏览器中显示的 nginx 登录页了(我使用的是虚拟机,所以是内网IP)。

welcometonginx

如果你看到上面这个页面,那么说明你刚刚装的 Nginx 服务已经正常运行了。

你可以将你的域名指向服务器 IP 地址,通过域名访问服务器网站。

第 4 步:管理 Nginx 进程

Nginx 服务已启动,以下是管理 Nginx 常用的命令

停止 Web 服务:

sudo systemctl stop nginx

启动 Web 服务器:

sudo systemctl start nginx

整个服务重启:

sudo systemctl restart nginx

如果只是修改了配置,只需要执行 reload 即可在 Nginx 不停止的情况下更新配置:

sudo systemctl reload nginx

禁用 Nginx 在服务器启动时启用:

sudo systemctl disable nginx

允许 Nginx 在启动时启用:

sudo systemctl enable nginx

以上是对 Nginx 管理的基本命令,接着我们来将如何在单一服务器上托管多个域名 / 网站。

第 5 步:设置服务器块(Server block)实现多站点、多域名托管

使用 Nginx Web 服务器时,服务器块(Server block),类似于 Apache 中的虚拟主机,一个「块」可以至少对应一个域名,也就是说一台服务器上我们托管多个站点。一个「块」在服务器上的实际映射就是一个特别的文件夹。

接下来,本教程将演示如何将一个「服务器块」添加上域名和对应的 html 网页内容,变成一个站点。

我们将设置一个名为 [kalacloud.com](http://kalacloud.com) **的域名,你可以将这个域名替换为你自己的域名**。

Ubuntu 上的 Nginx 默认启用了一个服务器块,这个「块」被配置为从/var/www/html

如果这台服务器仅托管一个站点,默认设置也可以,但如果你想托管多个站点,就需要更改设置。

首先,我们在 /var/www 下创建一个 [kalacloud.com](http://kalacloud.com) 站点目录。

以下命令为 [kalacloud.com](http://kalacloud.com) ****创建目录,使用 -p 递归创建目录,即使上级目录不存在,会按目录层级自动创建目录

sudo mkdir -p /var/www/[kalacloud.com](http://kalacloud.com)/html

接下来,使用$USER 来配置权限:

sudo chown -R $USER:$USER /var/www/[kalacloud.com](http://kalacloud.com)/html

如果我们没有修改自己的umask值,那么 Web 根目录的权限应该正确,我们可以通过输入以下命令来确认:

sudo chmod -R 755 /var/www/[kalacloud.com](http://kalacloud.com)

接着,编辑 index.html 文件:

nano /var/www/[kalacloud.com](http://kalacloud.com)/html/index.html

在里面,添加以下示例 HTML:

<html>
    <head>
        <title> 卡拉云 - 低代码开发工具,帮您高效开发 kalacloud.com!</title>
    </head>
    <body>
        <h2>真棒!你已经配置好了你的第一个网站</h2>
		<h3>更多内容欢迎访问<a href="https://kalacloud.com/">卡拉云</a> kalacloud.com</h3>
    </body>
</html>

使用CTRL+X 退出并保存。

接下来我们为 Nginx 来创建一个服务器块。与直接修改默认配置文件不同,我们在以下位置创建一个新文件:/etc/nginx/sites-available/kalacloud.com

sudo nano /etc/nginx/sites-available/[kalacloud.com](http://kalacloud.com)

然后,复制粘贴以下配置,这个块的配置与默认块的配置相似,但针对我们的新目录和域名进行了更新:

server {
        listen 80;
        listen [::]:80;
        root /var/www/kalacloud.com/html;
        index index.html index.htm index.nginx-debian.html;
        server_name [kalacloud.com](http://kalacloud.com) www.[kalacloud.com](http://kalacloud.com);
        location / {
                try_files $uri $uri/ =404;
        }
}

特别提醒:server_name 要修改为你的域名。root 修改为你的网站文件位置。

接下来,让我们通过在sites-enabled目录新建一个链接,好让 Nginx 在启动过程中会读取这个目录:

sudo ln -s /etc/nginx/sites-available/[kalacloud.com](http://kalacloud.com) /etc/nginx/sites-enabled/

现在已启用并配置了两个服务器块,以及基于它们的listenserver_name指令响应请求:

  • kalacloud.com: 将会响应 kalacloud.com 和 www.kalacloud.com的请求
  • default: 将会响应 80 端口的请求,以及不能匹配到两个服务器块上的请求

为避免可能由于添加其他服务器名称而引起的哈希存储区内存问题,有必要调整/etc/nginx/nginx.conf文件中的单个值。

打开文件:

sudo nano /etc/nginx/nginx.conf

找到server_names_hash_bucket_size指令并删除#符号:

...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

使用CTRL+X 退出并保存。

接下来,测试一下刚刚更新的配置文件,看看有没有语法错误:

sudo nginx -t

nginx-t

如果没有任何问题,我们重启 Nginx 服务,让刚刚的配置生效:

sudo systemctl restart nginx

Nginx 现在已经可以按照刚刚我们配置的方式来工作了。当用户通过http://kalacloud.com域名访问我们的服务器时,Nginx 会将它指向我们刚刚创建的 Html 页面。

(本教程 Nginx 示例运行在本地虚拟机中,所以是一个内网 IP)

09-kalacloud-nginx

第 6 步:Nginx 文件及目录结构

内容

  • /var/www/html/var/www/html:实际的 Web 内容,默认情况下仅包含您之前看到的默认 Nginx 页面,在目录之外提供。这可以通过更改 Nginx 配置文件来更改。

服务器配置

  • /etc/nginx:Nginx 配置目录。所有 Nginx 的配置文件都在这里。
  • /etc/nginx/nginx.conf Nginx 的配置文件。大多数全局配置可以通过这个文件来修改。
  • /etc/nginx/sites-available/sites-enabled 用来存储服务器下每个站点服务器块的目录。 默认情况下 Nginx 不会直接使用目录下的配置文件,需要我们更改配置来告诉 Nginx 来去读。
  • /etc/nginx/sites-enabled/sites-available 这里是存储已经启用站点服务器块的目录。
  • /etc/nginx/snippets 这个目录包含一些 Nginx 的配置文件。可打开详细查看这些配置文件到文档进行学习。

服务器日志

  • /var/log/nginx/access.log:这里是 Nginx 到日志文件,对 Web 服务器的每个请求都会记录在这个日志中。
  • /var/log/nginx/error.log: 记录 Nginx 运行过程中发生的错误日志。

教程总结

Nginx 是整个网站服务的基础,在它上面有非常多的应用服务,欢迎跟随卡拉云教程继续学习。如果你还有什么疑问,欢迎一起讨论。我的微信 HiJiangChuan。更多数据库相关教程可访问 卡拉云 查看。

卡拉云联合创始人蒋川的微信

© 2021 卡拉云 Built with ❤️ in Beijing

京ICP备15049164号-9