沐光

记录在前端之路的点点滴滴

Docker 安装 nginx

前言

自学 Docker 系列,了解常用包的使用和配置安装,此篇记录 nginx 的安装

安装配置

下载 nginx

1
docker pull nginx:latest

普通运行

1
docker run --name nginx -p 80:80 -d nginx

如果需要挂载在本地,则需要设置虚拟卷宗

1
docker run --name nginx -p 80:80 -v /Users/saitane/Docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /Users/saitane/Docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /Users/saitane/Docker/nginx/html:/usr/share/nginx/html -d nginx

此处我将 nginx.confdefault.confhtml静态文件夹 映射到本地的 nginx 文件夹内,之后就不用进入容器内配置文件以及繁琐的 docker cp 拷贝代码了,但得注意生成容器后需要将文件拷贝到本地

服务器 nginx 安装

除了 Docker 的安装方式,此处记录一下我在 centos 装 nginx 遇到的一些问题和解决方法。

安装 nginx

centos 装 ngixn 先查看下是否有安装 nginx 的源

1
2
3
4
5
6
7
yum repolist

# 如果有安装会有这么一行信息
# 源标识 源名称
# ...
# nginx/x86_64 nginx repo
# ...

若没有安装源,则安装一下 nginx 的源

1
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

启动 nginx

配置前先看一看是否有历史遗留的 nginx 服务

1
2
3
4
5
6
netstat -lntp | grep nginx

# 如我这里就有一些安装的,但是部分没用却没有停止的服务,根据情况 kill 掉部分
# tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14514/nginx: master
# tcp 0 0 0.0.0.0:440 0.0.0.0:* LISTEN 3451/nginx: master
# tcp 0 0 0.0.0.0:8099 0.0.0.0:* LISTEN 24166/nginx: master

如果需要深度清理残留 nginx 文件,find / -name nginx 根据情况来处理即可

处理完成后,注册 nginx 服务

1
2
3
4
5
6
7
# 注册开机启动 nginx
systemctl enable nginx
# 启动 nginx
service start nginx

# 重启指令: `service restart nginx`
# 停止指令: `service stop nginx`

注意,更新 nginx 文件后需要重启 nginx

然后 nginx 就启动成功了

配置 nginx

yum 安装的 nginx 配置文件一般在 /etc/nginx 内,配置 nginx.conf 或者 conf.d/default.conf 即可,更多配置可以翻查下文档,这里就不介绍了。

1
2
# 是在记不住就用这个命令查找,它会列举处所有地址
whereis nginx

此处仅仅改了 root 文件夹的位置,方便项目构建

1
2
3
4
5
# conf.d/default.conf
location / {
root <target-path>;
index index.html index.htm;
}

便捷指令记录:

  • 查看服务器 IP 地址命令: ifconfig -a
  • 查看端口是否占用: lsof -i:<端口>

问题总结

nginx 反向代理替换规则

代理地址是否添加尾部 ‘/‘ 会影响到路径的匹配,总结的规律如下:

1
2
3
4
5
6
7
location ^~ /xxx/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:1234/;
}

# 此最终会被替换成: http://127.0.0.1:1234/
1
2
3
4
5
6
7
location ^~ /xxx/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:1234;
}

# 此最终会被替换成: http://127.0.0.1:1234/xxx/
nginx 的 nginx.pid 丢失问题

nginx 重启时有时候会丢失 pid 文件,特别是被强制杀掉进程的情况,这种情况下我们需要进入 nginx 的安装目录的 sbin 下重新启动 nginx:

1
2
# cd <nginx-dir>/sbin
./nginx -c <nginx.conf path>

防止此丢失问题发生,在更新 nginx 时尽量使用 nginx reload 来平滑重启,重载配置。

参考文章