Nginx应用与运维——Nginx编译及部署(部署)

Nginx编译及部署

5、Nginx部署

5.1、环境配置

Nginx编译成功后,为了便于操作维护,建议把Nginx执行文件的路径添加到环境变量中,可以通过如下命令完成。

bash 复制代码
cat >/etc/profile.d/nginx.sh << EOF
PATH=$PATH:/usr/local/nginx/sbin
EOF
source /etc/profile

对于OpenResty,为了保持与Nginx的维护一致性,可以将Nginx目录软连接到/usr/local目录下。

bash 复制代码
ln -s /usr/local/openresty/nginx /usr/local/nginx

在CentOS操作系统中,配置文件通常放在/etc目录下,建议将Nginx的conf目录软连接到/etc目录下。

bash 复制代码
ln -s /usr/local/nginx/conf /etc/nginx

5.2、命令行参数

Nginx执行文件的命令行参数可以通过-h参数获取,Nginx命令行参数如下:

bash 复制代码
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
-?,-h         : this help
-v            : show version and exit
-V            : show version and configure options then exit
-t            : test configuration and exit
-T            : test configuration, dump it and exit
-q            : suppress non-error messages during configuration testing
-s signal     : send signal to a master process: stop, quit, reopen, reload
-p prefix     : set prefix path (default: /usr/local/openresty/nginx/)
-c filename   : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file

上述代码中的主要参数解释说明如下。

  • -v参数:显示Nginx执行文件的版本信息。
  • -V参数:显示Nginx执行文件的版本信息和编译配置参数。
  • -t参数:进行配置文件语法检查,测试配置文件的有效性。
  • -T参数:进行配置文件语法检查,测试配置文件的有效性,同时输出所有有效配置内容。
  • -q参数:在测试配置文件有效性时,不输出非错误信息。
  • -s参数:发送信号给Nginx主进程,信号可以为以下4个。
    • stop:快速关闭。
    • quit:正常关闭。
    • reopen:重新打开日志文件。
    • reload:重新加载配置文件,启动一个加载新配置文件的Worker Process,正常关闭一个加载旧配置文件的Worker Process。
  • -p参数:指定Nginx的执行目录,默认为configure时的安装目录,通常为/usr/local/nginx。
  • -c参数:指定nginx.conf文件的位置,默认为conf/nginx.conf。
  • -g参数:外部指定配置文件中的全局指令。

应用示例如下:

bash 复制代码
nginx -t                                        # 执行配置文件检测
nginx -t -q                             # 执行配置文件检测,且只输出错误信息
nginx -s stop                           # 快速停止Nginx
nginx -s quit                           # 正常关闭Nginx
nginx -s reopen                         # 重新打开日志文件
nginx -s reload                         # 重新加载配置文件
nginx -p /usr/local/newnginx            # 指定Nginx的执行目录
nginx -c /etc/nginx/nginx.conf          # 指定nginx.conf文件的位置
# 外部指定pid和worker_processes配置指令参数
nginx -g "pid /var/run/nginx.pid; worker_processes 'sysctl -n hw.ncpu';"

Tengine的扩展命令如下:

bash 复制代码
nginx -m                                      # 列出所有的编译模块
nginx -l                                        # 列出支持的所有指令

5.3、注册系统服务

CentOS系统环境中使用systemd进行系统和服务管理,可以按需守护进程,并通过systemctl命令进行systemd的监测和控制。为了方便Nginx应用进程的维护和管理,此处把Nginx注册成系统服务,由systemd进行服务管理,命令如下。

bash 复制代码
cat >/usr/lib/systemd/system/nginx.service <<EOF
[Unit]                                                # 记录service文件的通用信息
Description=The Nginx HTTP and reverse proxy server   # Nginx服务描述信息
After=network.target remote-fs.target nss-lookup.target  # Nginx服务启动依赖,在指定服务之后启动

[Service]                                         # 记录service文件的service信息
Type=forking                                     # 标准UNIX Daemon使用的启动方式
PIDFile=/run/nginx.pid                            # Nginx服务的pid文件位置
ExecStartPre=/usr/bin/rm -f /run/nginx.pid       # Nginx服务启动前删除旧的pid文件
ExecStartPre=/usr/local/nginx/sbin/nginx -t -q    # Nginx服务启动前执行配置文件检测
ExecStart=/usr/local/nginx/sbin/nginx -g "pid /run/nginx.pid;"  # 启动Nginx服务
ExecReload=/usr/local/nginx/sbin/nginx -t -q      # Nginx服务重启前执行配置文件检测
ExecReload=/usr/local/nginx/sbin/nginx -s reload -g "pid /run/nginx.pid;"  
                                                 # 重启Nginx服务
ExecStop=/bin/kill -s HUP $MAINPID                # 关闭Nginx服务
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]                                         # 记录service文件的安装信息
WantedBy=multi-user.target                        # 多用户环境下启用
EOF

systemctl enable nginx                            # 将Nginx服务注册为系统启动后自动启动
systemctl start nginx                             # 启动Nginx服务命令
systemctl reload nginx                            # reload Nginx服务命令
systemctl stop nginx                              # stop Nginx服务命令
systemctl status nginx                            # 查看Nginx服务运行状态命令

6、Nginx的Docker容器化部署

6.1、Docker简介

Docker是一款基于Go语言开发的开源应用容器引擎,Docker可以让用户将需要运行的应用服务和依赖环境打包在一个小体积的应用容器中,被打包的容器可以移植到任意可运行Docker环境的操作系统中,极大地缩短了应用服务编译和部署所需的时间。Docker的虚拟化机制也使得在不同操作系统环境下编译的应用服务都可运行在同一Docker宿主机中。

Docker中有两个基本概念:镜像(Image)和容器(Container)。Docker使用AUFS文件系统进行文件管理,这种文件系统的文件是分层叠加存储的,镜像是存储在只读层的文件,而运行的容器则是镜像运行的实例,它的实例文件存储在可写层中,所以通常需要先通过Docker命令制作镜像,然后再通过Docker编排命令将镜像运行成容器。

6.2、Docker环境安装

Docker的虚拟化机制是基于操作系统的进程级别虚拟化技术,所以Docker也可以安装在其他虚拟机中。在物理机或云环境的CentOS 7环境下均可通过yum命令实现快速安装,安装命令如下。

bash 复制代码
# 安装yum工具
yum install -y yum-utils

# 安装Docker官方yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装Docker及docker-compose应用
yum install -y docker-ce docker-compose

# 设置Docker服务开机自启动
systemctl enable docker 

# 启动Docker服务
systemctl start docker

6.3、Dockerfile常用命令及编写

Dockerfile是按照Docker Build语法约定的顺序结构规则脚本文件。通过Dockerfile的编写可以实现Docker镜像的自动化制作,本章所介绍的编译过程均可被编写在Dockerfile中,使用Docker命令打包为Nginx的Docker镜像。

Dockerfile常用命令如下。

  • 1)FROM用于指定构建当前镜像的基础镜像名,使用方法如下。

    bash 复制代码
    FROM centos
  • 2)MAINTAINER用于填写作者声明的描述信息,使用方法如下。

    bash 复制代码
    MAINTAINER Nginx Dockerfile Write by John.Wang
  • 3)ADD命令会向Image中添加文件,支持文件、目录、URL的源,使用方法如下。

bash 复制代码
ADD /tmp/init_nginx.sh /usr/local/nginx/sbin/
  • 4)COPY用于向镜像内复制文件夹,使用方法如下。

    bash 复制代码
    COPY . /tmp
  • 5)ENV设置Container启动后的环境变量,使用方法如下。

    bash 复制代码
    ENV PATH $PATH:/usr/local/nginx/sbin
  • 6)EXPOSE设置Container启动后对外开放的端口,它只相当于一个防火墙开放端口的概念,与实际运行的服务无关,使用方法如下。

    bash 复制代码
    EXPOSE 8080
  • 7)RUN用于在制作Image时执行指定的脚本或shell命令,使用方法如下。

    bash 复制代码
    RUM yum -y install net-tools
  • 8)USER设置运行Image或Container的系统用户,使用方法如下。

    bash 复制代码
    USER nginx:nginx
  • 9)VOLUME定义Image挂载点,该挂载点可被其他Container使用,且目录中的内容是共享的,将会同步更新,使用方法如下。

    bash 复制代码
    VOLUME ["/data1","/data2"]
  • 10)WORKDIR设置CMD参数指定命令的运行目录,使用方法如下。

    bash 复制代码
    WORKDIR ~/
  • 11)CMD命令是设定于Container启动后执行的命令,可被外部docker run命令参数覆盖,使用方法如下。

bash 复制代码
CMD "Hello Nginx"
  • 12)ENTRYPOINT命令是设定于Container启动后执行的命令,不可被外部docker run命令参数覆盖。

    bash 复制代码
    ENTRYPOINT /usr/local/nginx/sbin/init_nginx.sh

现在,可以按照Dockerfile的命令格式编写Dockerfile了,基础镜像选用CentOS 7, Nginx选用Nginx的扩展版本OpenResty 1.15.8.2。

Nginx镜像Dockerfile脚本如下:

bash 复制代码
FROM centos:centos7
MAINTAINER Nginx Dockerfile Write by John.Wang
RUN yum -y install epel-release && yum -y install wget gcc make pcre-devel \
    zlib-devel openssl-devel libxml2-devel libxslt-devel luajit GeoIP-devel \
    gd-devel libatomic_ops-devel luajit-devel perl-devel perl-ExtUtils-Embed

RUN cd /tmp && wget https://openresty.org/download/openresty-1.15.8.2.tar.gz  && \
    tar zxmf openresty-1.15.8.2.tar.gz && \
    cd openresty-1.15.8.2 && \
    ./configure \
        --with-threads \
        --with-file-aio \
        --with-http_ssl_module \
        --with-http_v2_module \
        --with-http_realip_module \
        --with-http_addition_module \
        --with-http_xslt_module=dynamic \
        --with-http_image_filter_module=dynamic \
        --with-http_geoip_module=dynamic \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_auth_request_module \
        --with-http_random_index_module \
        --with-http_secure_link_module \
        --with-http_degradation_module \
        --with-http_slice_module \
        --with-http_stub_status_module \
        --with-stream=dynamic \
        --with-stream_ssl_module \
        --with-stream_realip_module \
        --with-stream_geoip_module=dynamic \
        --with-libatomic \
        --with-pcre-jit \
        --with-stream_ssl_preread_module && \
    gmake && gmake install
ENV PATH $PATH:/usr/local/nginx/sbin
RUN ln -s /usr/local/openresty/nginx /usr/local/nginx
RUN ln -sf /dev/stdout /usr/local/nginx/logs/access.log && \
    ln -sf /dev/stderr /usr/local/nginx/logs/error.log
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]

在Dockerfile文件的同一目录下,执行如下命令构建Nginx的Dokcer镜像。

bash 复制代码
docker build -t nginx:v1.0 .

在脚本执行结束后,当尾行出现"Successfully taggednginx:v1.0"时表示Dokcer镜像已经构建成功,可以通过Docker命令docker images查看镜像是否已经存在于本地的镜像仓库中,查询结果如图所示。

6.4、Nginx Docker运行

Docker镜像在AUFS文件系统中是只读的,需要通过docker run命令以容器方式运行,脚本如下:

bash 复制代码
docker run --name nginx -p 80:80 -d nginx:v1.0
docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED
STATUS              PORTS               NAMES
26ffd54950e8        nginx:v1.0          "nginx -g 'daemon of..."  7 seconds ago
Up 7 seconds        0.0.0.0:80->80/tcp  nginx

通过curl命令访问本地80端口,可以返回OpenResty的提示信息。

Docker容器如果被移除,所有的修改文件同样会被删除,为了把变更的配置保存下来,需要把配置文件目录复制出来进行持久化,所以需要通过卷挂载的方式实现配置的使用和维护,脚本如下:

bash 复制代码
mkdir -p /opt/data/apps/nginx/
docker cp nginx:/usr/local/nginx/conf /opt/data/apps/nginx/
docker stop nginx
docker rm nginx
docker run --name nginx -h nginx -p 80:80 -v
/opt/data/apps/nginx/conf:/usr/local/nginx/conf -d nginx:v1.0

如图所示,Docker容器已经把本地目录挂载到容器中。

在使用docker run命令时,每次都需要使用很多参数,为了便于维护,可以用Docker-Compose工具进行容器编排,Docker-Compose是使用基于YAML语法的脚本配置文件来实现容器的运行管理的。Nginx的docker-compose.yaml脚本文件如下:

bash 复制代码
nginx:
    image: nginx:v1.0
    restart: always
    container_name: nginx
    hostname: 'nginx'
    ports:
        - 80:80
    volumes:
        - '/opt/data/apps/nginx/conf:/usr/local/nginx/conf'
相关推荐
帷幕落秋1 小时前
Redis主从复制
运维·数据库
乌暮1 小时前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试
帷幕落秋1 小时前
Mysql主从复制
运维·数据库
code2cat1 小时前
【随笔】MCP缓存期限与共享范围:让Agent复用资料时记住边界
java·后端·缓存·ai agent·mcp
暖核1 小时前
MySQL 高级运维核心:备份恢复、主从复制与 MHA 高可用复习总结
运维·数据库·mysql
jackletter1 小时前
linux:systemd之守护进程
linux·运维·服务器·systemd
逃逸线LOF2 小时前
工具类文件头文件
java
Wang's Blog2 小时前
Java 项目实战: 外卖平台优化-Nginx目录结构与conf配置文件体系
java·nginx
Ruiery2 小时前
Linux 6.6内核 CPU 深度解析(五):CPU 空闲状态机 cpuidle
linux·运维·服务器