Skip to content

docker nginx 配置文件以及 nginx include 指令例子

在 Docker 中使用 Nginx 时,配置文件和 include 指令的正确设置是至关重要的。它们不仅帮助维护清晰、可维护的配置结构,还能灵活地管理大量不同的服务和应用。下面,我将详细介绍如何在 Docker 中配置 Nginx,并使用 include 指令来模块化配置。

基本的 Docker Nginx 配置文件

首先,你需要一个基本的 Nginx 配置文件。

这个文件通常位于 /etc/nginx/nginx.conf,是 Nginx 运行的核心配置文件。

在 Docker 容器中,你可以通过将自定义的 nginx.conf 文件复制到容器中来覆盖默认配置。

这是一个基本的 nginx.conf 文件示例:

nginx
# 定义运行Nginx服务器的用户,这里设为nginx
user  nginx;

# 设置Nginx可以启动的工作进程数,auto表示自动根据可用CPU核数来决定
worker_processes  auto;

# 配置错误日志的路径和日志级别
error_log  /var/log/nginx/error.log notice;

# 设置Nginx服务的PID文件路径
pid        /var/run/nginx.pid;

# events块用于配置Nginx服务器如何处理网络连接
events {
    # 设置每个worker进程最大连接数,默认为1024
    worker_connections  1024;
}

# http块用于设置HTTP服务器的配置
http {
    # 引入MIME类型映射文件,定义服务器如何处理不同类型的文件
    include       /etc/nginx/mime.types;

    # 设置默认的MIME类型,如果请求的文件类型未定义则使用此类型
    default_type  application/octet-stream;

    # 定义日志格式,名为main,包括访问者IP,访问者用户,请求时间等信息
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 设置访问日志的路径和使用的日志格式
    access_log  /var/log/nginx/access.log  main;

    # 启用高效文件传输模式,减少磁盘读写操作,提升性能
    sendfile        on;
    # 开启此选项可以减少网络包的数量,提升网络效率
    #tcp_nopush     on;

    # 设置长连接的超时时间,单位是秒
    keepalive_timeout  65;

    # 启用gzip压缩可以提高传输速度和节约带宽,这里默认关闭
    #gzip  on;

    # 包含其他配置文件,通常用于加载sites-available里的站点配置
    include /etc/nginx/conf.d/*.conf;
}

使用 Dockerfile 设置 Nginx

创建一个 Dockerfile 来使用自定义的 Nginx 配置:

Dockerfile
FROM nginx:latest

# 删除默认的配置文件
RUN rm /etc/nginx/conf.d/default.conf

# 添加自定义的 Nginx 配置文件到容器
COPY nginx.conf /etc/nginx/nginx.conf
COPY example.conf /etc/nginx/conf.d/

# 暴露端口
EXPOSE 80 443

# 使用前台运行模式启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

使用 include 指令实现配置的模块化

Nginx 的 include 指令允许你将配置分散到多个文件中,这样可以更易于管理大型配置。这一指令可以包括其他文件或目录中的配置,常见的用法如下:

  1. 包含通用配置片段: 例如,可以将 SSL 配置、反向代理配置、安全头配置等分别保存在不同的文件中,并在需要时包括它们。

  2. 网站特定配置:conf.d 目录或类似的目录中包含特定于单个站点的配置文件。

  3. 动态配置: 使用通配符(如 include /etc/nginx/sites-enabled/*;)动态包含一组配置文件,这在管理多个虚拟主机时特别有用。

示例:模块化的虚拟主机配置

假设你有一个虚拟主机配置文件 example.com.conf,你可以使用 include 指令来引入 SSL 参数和其他配置,以保持主配置文件的整洁:

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    # 重定向所有 HTTP 流量到 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/certs/example.com.pem;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    include /etc/nginx/snippets/ssl-params.conf;  # 包含 SSL 参数

    location / {
        root /var/www/example.com/html;
        index index.html;
    }

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
}

通过这种方式,你可以维护多个网站的配置文件,每个文件都仅包含特定于该站点的设置,而共用的配置(如 SSL 设置)则可以在需要时通过 include 指令引入,提高了配置的可管理性和可维护性。 这种模块化方法在 Docker 环境中尤其有用,因为它允许你通过简单地映射卷或复制文件来动态更改和部署配置。