16、在云基础设施中部署和管理NGINX

在云基础设施中部署和管理NGINX

1. 使用Docker部署NGINX

1.1 安装Docker

Docker不仅是一个工具,更是一种范式转变,它可以将软件打包和隔离,确保在不同环境中保持一致性。Docker团队提供了一个脚本,简化了在多种Linux发行版(如Red Hat Enterprise Linux、CentOS、Fedora、Debian、Ubuntu及其衍生版本)上的安装过程。

安装步骤如下:
1. 以root权限打开终端,运行以下命令:

# curl -s https://get.docker.com | bash

这个命令会使用适应你Linux发行版包管理器的自定义仓库,将Docker原生安装到你的系统中。后续更新Docker就像更新系统中的其他包一样简单。

1.2 运行第一个Docker容器

有多种方式可以操作Docker容器,例如使用简单命令启动容器:

root@docker:~# docker run -d nginx

此命令会从Docker Hub拉取NGINX镜像,并以分离模式启动一个新容器。不过,这个容器使用的是默认设置,还未针对特定用途进行配置。

若要将容器的端口80映射到主机的端口80,允许Web流量访问容器,可以运行以下命令:

root@docker:~# docker run -d nginx -p 80:80

第一个命令以默认配置启动NGINX容器,第二个命令启动相同的容器,但现在可以通过主机的端口80访问该容器。

1.3 使用Docker Compose简化管理

直接从命令行管理容器的参数很快会变得繁琐,而Docker Compose可以使用YAML文件进行配置,简化多容器Docker应用的定义和运行过程。

以下是创建一个将端口80暴露给主机的NGINX容器的步骤:
1. 创建 /root/nginx 目录,并在该目录下保存一个名为 docker-compose.yml 的文件,内容如下:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"

请注意,虽然文件格式是YAML,但扩展名需要是 .yml 。在这个文件中,我们定义了一个名为 nginx 的服务,使用了标记为 latest 的官方NGINX镜像,这意味着每次从Docker Hub拉取时都会更新。你也可以指定固定版本,如 nginx:1.25.4 ,更多详细信息可在 Docker Hub for NGINX页面 查看。
2. 保存好Docker Compose文件后,在同一目录下运行以下命令:

root@nginx:~/nginx# docker compose up
  1. 若要停止容器,可以使用 Ctrl + C 快捷方式( ^C )。或者,你可以以分离模式启动容器( up -d ),并使用 down 命令停止它:
root@nginx:~/nginx# docker compose up -d
root@nginx:~/nginx# docker compose down

1.4 在Docker中设置NGINX

熟悉Docker Compose后,我们可以进一步优化NGINX容器,添加个性化配置和网站内容。

修改之前创建的 docker-compose.yml 文件,挂载卷以使用主机的实际配置文件和内容:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html

在这个设置中, ./config/nginx.conf 是主机上自定义NGINX配置文件的路径, /etc/nginx/nginx.conf 是NGINX容器期望找到配置文件的路径。第二个卷 ./html 是主机上包含网站内容的目录,会挂载到Docker容器的 /usr/share/nginx/html/ 中。这样,你可以直接在主机上编辑NGINX配置或网站内容,这些更改会反映在容器内。

需要注意的是,NGINX是预配置的,你可以跳过挂载 nginx.conf 卷,使用默认设置,但一定要挂载 html 目录,因为NGINX期望在该目录中找到要提供的Web内容。

1.5 集成PHP与NGINX

为了让NGINX服务器能够处理动态内容,我们可以集成PHP。以下是具体步骤:
1. 扩展现有的 docker-compose.yml 文件,添加一个运行FastCGI进程管理器(php-fpm)的PHP服务:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    depends_on:
      - php
  php:
    image: php:8.3-fpm
    volumes:
      - ./html:/usr/share/nginx/html

在这个设置中, php 服务使用了带有 php-fpm 的官方PHP镜像,并且将 html 目录挂载到PHP容器中,确保它可以访问与NGINX相同的Web文件。
2. 编辑 nginx.conf 文件,包含FastCGI参数:

events {}
http {
  server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    location / {
      try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
      try_files $uri =404;
      fastcgi_pass php:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
  }
}

这个配置会指示NGINX将对PHP文件的请求转发到 php 容器中运行的PHP-FPM服务。
3. 运行 docker compose up 命令,NGINX将同时提供静态内容和动态PHP页面:

root@nginx:~/nginx# docker compose up
  1. 启动容器后,创建一个包含 <?php phpinfo(); ?> 的PHP文件,访问该文件时会显示PHP信息页面,确认容器之间的通信成功。

1.6 使用Docker中的NGINX代理主机应用程序

Docker天生支持容器与主机的连接,在容器中设置NGINX时,可以使用特殊的 host.docker.internal 主机名来指向主机。

以下是一个与主机上托管的Web应用程序交互的NGINX代理配置示例:

server {
  listen 80;
  location /hostapp {
    proxy_pass http://host.docker.internal:4000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

为确保NGINX能够与主机服务器的Web应用程序通信,需要检查主机的防火墙是否允许指定端口的传入流量。

2. 使用Ansible部署和管理NGINX

2.1 理解配置管理

配置管理就像是基础设施设置的万能钥匙,特别是在处理多个部署时。它可以确保系统的各个部分协调一致,便于扩展或克隆配置,节省时间、保持组织有序,并尽可能实现自动化。

Ansible是一款以简单和高效著称的配置管理工具,它通过SSH运行,无需在每个服务器上安装代理,减少了设置开销,并且具有轻量级的特点。虽然本教程主要关注Ubuntu,但这些原则和实践也可以通过对不同包管理器和系统布局进行小调整,应用到其他发行版(如Debian、RHEL或Fedora)。

2.2 运行第一个Ansible playbook

Ansible通过playbook编排任务,每个playbook可以有多个角色。以下是使用Ansible安装NGINX的步骤:
1. 安装Ansible:

root@ansible:~# apt install ansible
  1. 检查Ansible是否安装成功:
root@ansible:~# ansible --version
  1. 创建第一个Ansible角色来安装NGINX:
root@ansible:~# ansible-galaxy init nginx_install

这将创建一个名为 nginx_install 的目录,包含任务、处理程序、模板等子目录。
4. 创建 roles/nginx_install/tasks/main.yml 文件,内容如下:

---
- name: Install nginx
  apt:
    name: nginx
    state: latest
    update_cache: yes

这个文件定义了一个使用Ubuntu包管理器安装NGINX的任务。
5. 创建一个playbook来使用该角色,在 nginx_install 项目的根目录下创建 nginx_install.yml 文件,内容如下:

---
- hosts: webservers
  become: true
  roles:
    - nginx_install

这个playbook会将角色应用到所有设置的主机(组: webservers )。
6. 创建 inventory.ini 文件,存储机器的地址:

[webservers]
server_ip ansible_ssh_user=root

请确保使用SSH密钥,并将 server_ip 替换为服务器的IP地址,以便连接到服务器。如果涉及多个服务器, inventory.ini 文件可以扩展为列出每个服务器:

[webservers]
server1.example.com ansible_ssh_user=root
server2.example.com ansible_ssh_user=root
[backend_api]
api1.example.com ansible_ssh_user=root
api2.example.com ansible_ssh_user=root
  1. 运行playbook:
root@ansible:~/nginx_install# ansible-playbook -i inventory.ini nginx_install.yml

再次运行playbook时,它会识别到NGINX已经安装,不会再次尝试安装。你可以通过访问端口80的Web服务器来检查NGINX是否可用。

2.3 使用Ansible设置NGINX配置文件

在之前创建的 nginx_install 项目基础上,我们可以让Ansible写入 nginx.conf 文件:
1. 创建 roles/nginx_install/files 目录,并将 nginx.conf 文件添加到该目录中:

mkdir -p roles/nginx_install/files
  1. 编辑 roles/nginx_install/tasks/main.yml 文件,添加以下内容:
- name: Copy nginx configuration file
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
  notify: restart nginx

这个任务会将 nginx.conf 文件从本地目录发送到远程服务器的 /etc/nginx/ 目录。
3. 创建一个处理程序来重启NGINX,在 roles/nginx_install/handlers 目录下创建 main.yml 文件,内容如下:

- name: restart nginx
  service:
    name: nginx
    state: restarted
  1. 再次运行playbook:
root@ansible:~/nginx_install# ansible-playbook -i inventory.ini nginx_install.yml

输出会显示 Install nginx 任务为 OK ,因为之前已经安装了NGINX。 Copy nginx configuration file 任务成功后,会触发处理程序重启NGINX。如果再次运行playbook,由于它识别到NGINX已经安装且配置文件存在,不会重复这些操作。

2.4 设置自动更新

unattended-upgrades 是一个很有价值的工具,它可以确保系统在遇到安全漏洞(如CVE漏洞)时自动接收更新。对于像NGINX这样的关键应用程序,保持领先于潜在威胁至关重要。当为NGINX发布安全更新时, unattended-upgrades 会处理更新过程,让你无需手动干预,确保服务器保持安全。

通过以上步骤,我们可以在云基础设施中高效地部署、管理和更新NGINX,结合Docker和Ansible的优势,提高系统的安全性和可维护性。

3. 总结与实践建议

3.1 技术要点回顾

在前面的内容中,我们学习了如何使用 Docker 和 Ansible 来部署、管理和更新 NGINX。下面通过表格的形式对关键技术点进行总结:
| 技术工具 | 主要功能 | 关键操作步骤 |
| — | — | — |
| Docker | 容器化部署,确保软件在不同环境的一致性 | 1. 安装: curl -s https://get.docker.com | bash
2. 运行容器: docker run -d nginx
3. 使用 Docker Compose:创建 docker-compose.yml 文件并运行 docker compose up |
| Docker Compose | 简化多容器 Docker 应用管理 | 1. 编写 docker-compose.yml 文件定义服务和配置
2. 运行 docker compose up 启动容器 |
| Ansible | 配置管理,自动化部署和更新 | 1. 安装: apt install ansible
2. 创建角色和 playbook: ansible-galaxy init nginx_install
3. 运行 playbook: ansible-playbook -i inventory.ini nginx_install.yml |

3.2 实践流程梳理

为了更清晰地展示整个实践过程,我们可以使用 mermaid 格式的流程图来梳理:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(安装 Docker):::process
    B --> C(运行第一个 Docker 容器):::process
    C --> D(使用 Docker Compose 管理容器):::process
    D --> E(在 Docker 中设置 NGINX):::process
    E --> F(集成 PHP 与 NGINX):::process
    F --> G(使用 Docker 中的 NGINX 代理主机应用程序):::process
    G --> H(安装 Ansible):::process
    H --> I(运行第一个 Ansible playbook 安装 NGINX):::process
    I --> J(使用 Ansible 设置 NGINX 配置文件):::process
    J --> K(设置自动更新):::process
    K --> L([结束]):::startend

3.3 常见问题及解决方法

在实践过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方法:
| 问题描述 | 可能原因 | 解决方法 |
| — | — | — |
| Docker 安装失败 | 网络问题、系统权限不足 | 检查网络连接,确保以 root 权限运行安装命令 |
| Ansible playbook 运行失败 | 主机连接问题、角色或 playbook 配置错误 | 检查 SSH 密钥和主机地址,确保角色和 playbook 文件配置正确 |
| NGINX 无法访问 | 端口映射问题、防火墙限制 | 检查 docker-compose.yml 中的端口映射配置,检查主机防火墙设置 |

3.4 进一步优化建议

为了让系统更加稳定和高效,我们可以考虑以下优化建议:
1. 容器资源管理 :在 docker-compose.yml 中为容器设置资源限制,避免容器占用过多系统资源。例如:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
  1. Ansible 自动化扩展 :可以编写更复杂的 Ansible playbook,实现更多自动化任务,如定期备份、监控系统状态等。
  2. 安全加固 :定期更新 Docker 镜像和系统软件,使用安全的 SSH 密钥,设置合理的防火墙规则,确保系统安全。

4. 结语

通过使用 Docker 和 Ansible,我们可以在云基础设施中轻松地部署、管理和更新 NGINX。Docker 的容器化技术让我们能够快速部署和迁移应用,而 Ansible 的自动化配置管理则大大提高了系统的可维护性和一致性。在实际应用中,我们可以根据具体需求对这些技术进行灵活运用,不断优化系统性能和安全性。希望本文能够帮助你更好地掌握在云环境中使用 NGINX 的方法,让你的应用程序更加稳定和高效。

在未来的实践中,你可以继续探索这些技术的更多功能和应用场景,不断提升自己的技术水平。同时,也可以将这些技术应用到更多的项目中,为企业和用户提供更好的服务。

内容概要:本文系统研究了基于模型预测控制(MPC)与滚动时域估计(MHE)集成的控制方法,旨在实现动态系统的高精度目标点镇定。通过构建MPC与MHE的协同框架,利用MHE对系统状态进行实时、高效的滚动优化估计,克服传感器测量噪声与初始状态不确定的影响,并将估计结果反馈至MPC控制器,实现对未来控制序列的滚动优化,从而提升系统在复杂干扰不确定性环境下的镇定性能与鲁棒性。研究涵盖算法原理推导、数学建模、仿真设计与验证全过程,提供了完整的Matlab代码实现,充分展示了该集成策略在状态估计与反馈控制协同优化方面的优越性。; 适合人群:具备自动控制理论基础Matlab编程能力,从事控制工程、自动化、机器人、航空航天或相关领域研究的研发人员及研究生。; 使用场景及目标:①应用于移动机器人、无人机、自动驾驶等需要高精度状态反馈的自主系统目标点镇定任务;②解决系统状态不可直接测量或受强噪声干扰时的状态估计与反馈控制耦合问题;③为先进预测控制与状态估计算法的联合设计与工程实现提供可复现的技术范例与实践指导; 阅读建议:建议读者结合Matlab代码逐模块分析算法实现细节,重点关注MHE状态估计与MPC控制指令生成之间的数据交互逻辑与时序配合,并尝试在不同非线性系统模型上进行迁移测试,以深入理解MPC-MHE集成机制的核心优势与调参规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值