在云基础设施中部署和管理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
- 若要停止容器,可以使用
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
- 启动容器后,创建一个包含
<?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
- 检查Ansible是否安装成功:
root@ansible:~# ansible --version
- 创建第一个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
- 运行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
- 编辑
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
- 再次运行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
- Ansible 自动化扩展 :可以编写更复杂的 Ansible playbook,实现更多自动化任务,如定期备份、监控系统状态等。
- 安全加固 :定期更新 Docker 镜像和系统软件,使用安全的 SSH 密钥,设置合理的防火墙规则,确保系统安全。
4. 结语
通过使用 Docker 和 Ansible,我们可以在云基础设施中轻松地部署、管理和更新 NGINX。Docker 的容器化技术让我们能够快速部署和迁移应用,而 Ansible 的自动化配置管理则大大提高了系统的可维护性和一致性。在实际应用中,我们可以根据具体需求对这些技术进行灵活运用,不断优化系统性能和安全性。希望本文能够帮助你更好地掌握在云环境中使用 NGINX 的方法,让你的应用程序更加稳定和高效。
在未来的实践中,你可以继续探索这些技术的更多功能和应用场景,不断提升自己的技术水平。同时,也可以将这些技术应用到更多的项目中,为企业和用户提供更好的服务。
超级会员免费看

2402

被折叠的 条评论
为什么被折叠?



