在【Docker环境】中将Nginx集成到Web服务器中
首先
以前,我使用Rails和Vue的应用程序架构来构建了Docker环境。
然而,由于我只使用Puma作为Rails的开发服务器,所以我进行了角色分配并改变了架构配置。
-
- webサーバー: nginx
- applicationサーバー: puma
将作业内容记录下来作为备忘录。
应用程序的构成图像
应用技术
-
- Rails: 6.0.4.4
- nginx: 1.21.6
只需一种选择。
- dockerでrailsの開発環境を構築済み
理解nginx的初始设置。
在实施之前,先确认一下nginx的默认配置如何运行。
在DockerHub上选择nginx:1.21.6-alpine镜像,并使用该镜像生成容器时,容器内的/etc/nginx/conf.d/目录下会自动产生一个default.conf文件。
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
当您访问在其容器上启动的状态下的http://localhost时,您可以看到欢迎页面并确认nginx已成功启动。
暂时我们确认了该文件是基于默认设置在运行。(Nginx的初始配置的详细内容将在另一个机会学习)
执行
这次的目标是从nginx访问Rails并确保其正常运行。
阅读nginx的技术书,以学习负载均衡和错误日志整理等详细设置。
开始实施。
目录结构
尽管前端和.env与本次实施无直接关系,但为了完整呈现整体情况,我们还是将其包含在内。
-
- frontend: Vueを構成
- .env: 環境変数を管理
% tree root -a
root
├── docker-compose.yml
├── .env
├── backend
・ ・
・ ・
・ ・
│ ├── Dockerfile
│ └── config
│ └── puma.rb
├── frontend
・ ・
・ ・
・ ・
│ └── Dockerfile
└── web
├── Dockerfile
└── nginx.cnf
任务/工作
在每个文件中通过评论进行补充说明。
请注意,以下是连接Nginx和Puma的套接字的使用顺序。
-
- 使用Dockerfile(Rails)的CMD命令来启动puma。
-
- 在puma.rb中使用bind命令创建一个名为puma.sock的socket。
-
- 在docker-compose.yml的volumes中将该socket与nginx容器共享。
-
- 使用Dockerfile(Nginx)的COPY命令将主机上的nginx.conf复制到nginx容器中。
- 在该nginx.conf的upstream部分使用共享的socket进行连接。
### 環境変数は.envファイルで管理 ###
version: '3.8'
services:
# DBコンテナ
db:
image: mysql:8.0.28
command: --default-authentication-plugin=mysql_native_password
volumes:
- "./db:/var/lib/mysql"
- "./db/personal_config/my.cnf:/etc/mysql/conf.d/my.cnf"
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
TZ: Asia/Tokyo
# Railsコンテナ
backend:
build:
context: ./backend
args:
WORKDIR: $WORKDIR
volumes:
- "./backend:/$WORKDIR"
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
ports:
- "8000:3000"
depends_on:
- db
# Nginxコンテナ
web:
build:
# Dockerfileのパスを指定する
context: ./web
volumes:
# 独自のNginx設定ファイルをコンテナに同期させる
- ./web:/app/public
# Railsのpuma起動時に生成されるpuma.sockをNginxコンテナにも共有する
- ./backend/tmp/sockets:/app/tmp/sockets
ports:
- 80:80
# 先にRailsが動くように依存関係を作る
depends_on:
- backend
# Vueコンテナ
frontend:
build:
context: ./frontend
args:
WORKDIR: $WORKDIR
volumes:
- "./frontend:/$WORKDIR"
ports:
- "3000:3000"
depends_on:
- backend
FROM ruby:2.7.5-alpine
ARG WORKDIR
ARG RUNTIME_PACKAGES="bash imagemagick nodejs yarn tzdata mysql-dev mysql-client git"
ARG DEV_PACKAGES="build-base curl-dev"
ENV HOME=/${WORKDIR} \
TZ=Asia/Tokyo
WORKDIR ${HOME}
COPY Gemfile* ./
RUN apk update && \
apk upgrade && \
apk add --no-cache ${RUNTIME_PACKAGES} && \
apk add --virtual build-dependencies --no-cache ${DEV_PACKAGES} && \
bundle install -j4 && \
apk del build-dependencies
COPY . ./
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
# pumaを起動させる
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
--省略--
# puma起動時にソケットであるpuma.sockを作成する
bind "unix:///app/tmp/sockets/puma.sock"
# ベースイメージ
FROM nginx:1.21.6-alpine
# Nginxに関わる設定ファイルを全削除
RUN rm -f /etc/nginx/conf.d/*
# 独自の設定ファイルを機能する場所に配置する
COPY nginx.conf /etc/nginx/conf.d/custum.conf
# Railsのpumaが生成したソケットにnginxを繋ぐ
upstream app {
server unix:///app/tmp/sockets/puma.sock;
}
server {
# クライアントからのリクエストを80番ポートで待ち受ける
listen 80;
# サーバー名称をlocalhostに設定
server_name localhost;
# ドキュメントルートを/app/publicに設定
root /app/public;
# 静的ファイルが存在しなければ、@app(=Rails)にリクエストを渡す
try_files $uri/index.html $uri @app;
location @app {
# プロキシのヘッダー情報をクライアント情報に書き換えする
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# プロキシの受け渡し先(upstreamで定義したappに合わせる)
proxy_pass http://app;
}
}
动作验证
在浏览器中输入http://localhost,便会显示Rails的启动页面。
顺便说一下,如果使用Vue通过axios进行HTTP通信,只需将请求发送到Nginx的80号端口即可实现通信。
请提供更具体的参考文章。
结束
考虑到可用性和安全性方面,目前的设置可能不够充分吧…
如果有时间的话,我想先完整阅读nginx技术书,然后实施一个很好的项目。
感谢您一直阅读到最后!