# Nginx

Nginx 是一个功能强大的开源反向代理服务器,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。它也可以做负载均衡器、HTTP 缓存或 Web 服务器。

Nginx 特性:

  • 热部署:采用 master 管理进程与 worker 工作进程的分离设计,支持热部署。在不间断服务的前提下,可以直接升级版本。也可以在不停止服务的情况下修改配置文件,更换日志文件等
  • 高并发连接:Nginx 可以轻松支持超过 100K 的并发,理论上支持的并发连接上限取决于机器内存
  • 低内存消耗:在一般的情况下,10K 个非活跃的 HTTP keep-alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这也是 Nginx 支持高并发连接的基础
  • 响应快:在正常情况下,单次请求会得到更快的相应。在高峰期,Nginx 可以比其它 Web 服务器更快地响应请求
  • 高可靠性:Nginx 是一个高可靠性的 Web 服务器,这也是用户为什么选择 Nginx 的基本条件,现在很多网站都在使用 Nginx,足以说明 Nginx 的可靠性。高可靠性来自其核心框架代码的优秀设计和实现

可以使用 docker run 指令直接运行官方 nginx 镜像

[root@sarly docker]# docker run -d -p 80:80 --name nginx nginx
0f850eb7c1d7db3d558905511af20a7e1cd071602faeae54aebdc9f8be725e4f
[root@sarly docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
0f850eb7c1d7        nginx               "/docker-entrypoin..."   2 seconds ago       Up 1 second         0.0.0.0:80->80/tcp   nginx

目前 Nginx 容器已经在 0.0.0.0:80 启动并映射了 80 端口,此时可以打开浏览器访问此地址,就可以看到 Nginx 输出的页面

# 自定义 Web 页面

首先,新建 index.html 文件,自定义内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Nginx Web</title>
</head>
<body>
    <div>
        Hello Nginx!
    </div>
</body>
</html>

启动 Nginx 并挂载文件目录到容器

[root@sarly nginx]# docker run -d --name nginx -p 80:80 -v /root/docker/nginx:/usr/share/nginx/html:ro --privileged=true nginx
2d7b7e2ac6ccb91a882e7c1091fa5e7c7215eef50a242827758c17443b415b2d

也可以使用自定义 Dockerfile

# 设置继承自创建的sshd镜像
FROM sshd:dockerfile
# 创建着基本信息
MAINTAINER docker_user (user@docker.com)
# 安装nginx,设置nginx已非daemon方式启动
RUN \
    apt-get install -y nginx && \
    rm -rf /var/lib/apt/lists/* && \
    echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \
    chown -R www-data:www-data /var/lib/nginx
RUN echo "Asia/Shanghai" > /etc/timezone && \
    dpkg-reconfigure -f noninteractive tzdata
# 注意这里是更改系统的时区设置,因为在Web应用中经常会用到时区这个系统变量
# 添加用户的脚本,并设置权限
ADD run.sh /run.sh
RUN chmod 755 /*.sh
# 定义可以被挂载的目录,分别是虚拟主机的挂载目录、证书目录、配置目录和日志目录
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx"]
# 定义工作目录
WORKDIR /root/docker/nginx
# 定义输出命令
CMD ["/run.sh"]
# 定义输出端口
EXPOSE 80
EXPOSE 443

run.sh 脚本文件内容

#! /bin/bash
/usr/sbin/sshd &
/usr/sbin/nginx

创建镜像,使用 docker build,创建 nginx:stable

[root@sarly nginx]# docker build -t nginx:stable .

启动容器,查看内部的 80 端口被映射到本地的 32770 端口

[root@sarly nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                           NAMES
88d07c44b263        nginx:stable        "/run.sh"                58 minutes ago      Up 58 minutes       0.0.0.0:32771->22/tcp, 0.0.0.0:32770->80/tcp, 0.0.0.0:32769->443/tcp, 0.0.0.0:32768->5000/tcp   agitated_khorana
12350822a21f        nginx               "/docker-entrypoin..."   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp
Edited on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

小芳芳 WeChat Pay

WeChat Pay

小芳芳 Alipay

Alipay