Docker で Nginx イメージ サーバーを構築する方法

Docker で Nginx イメージ サーバーを構築する方法

序文

一般的な開発では、画像をディレクトリにアップロードし、ディレクトリとファイル名を連結してデータベースに保存しますが、この方法は適切に行われないと特定の欠陥が発生する可能性があります。

プロジェクトを移転する場合、サーバー自体はまだ使用中であっても、サーバー上に保存されているプロジェクト関連の画像も移転する必要があり、同時にコードも修正する必要があり、非常に手間がかかります。画像を保存するための専用サーバーを構築し、FTP 経由で転送する場合は、コードを変更する必要はありません。

ここでは Docker と Nginx の紹介と利点については詳しく説明しません。インターネット上には多くのブログやチュートリアルがあります。

環境構築

環境構築の一部のモジュールは詳細が十分でない可能性があります。詳細を知りたい場合は、他の資料を確認してください。ここでは簡単な操作のみを説明します。

1. Dockerをインストールする

yumでdockerをインストール

2. Nginxイメージを取得する

docker pull nginx:1.16.0

バージョン番号は 1.16.0 です。docker search nginx でイメージをクエリできます。tomcat、mysql などの他のイメージをプルする場合も同様です。

3. dockerマウント用のメインファイルを作成する

mkdir -p /home/nginx/www /home/nginx/logs /home/nginx/conf

4. Nginxコンテナを作成して実行する

docker run -d -p 80:80 -p 443:443 --name nginx-server -v /home/nginx/www:/usr/share/nginx/html 
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs:/var/log/nginx nginx

5. ホスト上にNginx設定ファイルを作成する

/home/nginx/confに新しいファイルnginx.confを作成し、次の設定を記述します。

ユーザー root;
ワーカープロセス 1;
error_log /var/log/nginx/error.log 警告;
pid /var/run/nginx.pid;
イベント {
 ワーカー接続 1024;
}
http {
 /etc/nginx/mime.types を含めます。
 デフォルトタイプ アプリケーション/オクテットストリーム;
 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 メイン;
 ファイル送信オン;
 #tcp_nopush オン;
 キープアライブタイムアウト65;
 #gzip オン;
 /etc/nginx/conf.d/*.conf を含めます。
 サーバー{
 443 ssl を聴く;
 server_name IP アドレスまたはドメイン名。
 ルート /usr/share/nginx/html;
 ssl_certificate あなたのキー.pem;
 ssl_certificate_key あなたのキー.key;
 ssl_session_timeout 5分;
 ssl_session_cache 共有:SSL:1m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:aNULL:!MD5:!ADH:!RC4;
 ssl_プロトコル TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers をオン;
 # ポート 8080 にジャンプします。これは私の Tomcat コンテナです。ブラウザに https://ip/ と入力すると、Tomcat コンテナ (すでに実行されており、ポート番号がマップされている) にジャンプします。
 位置 / {
  ルート /usr/share/nginx/html;
  プロキシパス http://ip:8080/;
  インデックス index.html index.htm;
 }
     # ブラウザに https://ip/images/ と入力すると、これは以前にマウントされているため、ホストマシン上の /home/nginx/www/images/ に対応します。つまり、ホストマシン上のディレクトリと Docker コンテナ内のフォルダがデータを共有します。# まず、ホストマシン上の /home/nginx/www/ に images ディレクトリを作成します。場所 ~ /images/ {
  ルート /usr/share/nginx/html/;
 }
 }
 サーバー{
 聞く 80;
 server_name IP アドレスまたはドメイン名。
 ^ https://$host$1 を永続的に書き換えます。
 }
}

ここで SSL 設定があります。まずドメイン名を申請し、SSL 証明書を取得して設定する必要があります。ここでは詳細には触れません。

環境設定はほぼ完了です。次にvsftpdをインストールしてftpを構築します。

FTPの設定

vsftpdをインストールする

yum -y vsftpdをインストールします

ユーザーの追加

useradd カスタムユーザー名

passwd カスタムパスワード

設定ファイルを変更する

vi /etc/vsftpd/vsftpd.conf

変更が必要な箇所は以下のとおりです。

# 設定ファイルのデフォルト値はYESで、匿名アクセスがサポートされていることを意味します。サポートしないように設定されている場合
匿名を有効にする=いいえ
# 最後にこの2行を追加します
pasv_min_port=30000
pasv_max_port=30009

保存して終了した後にユーザーのアクセス権を設定する

chown ftpadmin /home/nginx/www/image
chmod 777 -R /home/nginx/www/image

テスト後、FTP 経由でアップロードすると、ブラウザの https リクエストを通じて次の結果が得られました。

*もう 1 つ: Alibaba Cloud サーバーの場合は、セキュリティ グループを構成し、ポート 21 とポート 443、80、30000 ~ 30009 を開くことを忘れないでください。

Java での FTP 転送の実装

まずリソースにftpResource.propertiesファイルを作成し、パラメータを記述します。

FTP_ADDRESS=あなたのIP
FTP_ポート=21
FTP_USERNAME=ユーザー名
FTP_PASSWORD=ユーザーパスワード
FTP_BASE_PATH=/home/nginx/www/images
IMAGE_BASE_URL=https://ドメイン/images/

次にFTP送信用のツールクラスを作成します

org.apache.commons.net.ftp.FTP をインポートします。
org.apache.commons.net.ftp.FTPClient をインポートします。
org.springframework.beans.factory.annotation.Value をインポートします。
org.springframework.context.annotation.PropertySource をインポートします。
org.springframework.stereotype.Component をインポートします。
java.io.* をインポートします。
/**
 * @著者マックス
 */
@成分
@PropertySource("クラスパス:ftpResource.properties")
パブリッククラス FtpUtil {
 /**
 * FTP_ADDRESS: FTPサーバーのIPアドレス * FTP_PORT: FTPサーバーのポート、デフォルトは21
 * FTP_USERNAME: FTP サーバーのユーザー名* FTP_PASSWORD: FTP サーバーのパスワード* FTP_BASE_PATH: 画像を保存する FTP サーバーの絶対パス* IMAGE_BASE_URL: インターネットから画像にアクセスするための FTP サーバーのパス*/
 @Value("${FTP_ADDRESS}")
 プライベート文字列 FTP_ADDRESS;
 @Value("${FTP_PORT}")
 プライベート整数 FTP_PORT;
 @Value("${FTP_USERNAME}")
 プライベート文字列 FTP_USERNAME;
 @Value("${FTP_PASSWORD}")
 プライベート文字列 FTP_PASSWORD;
 @Value("${FTP_BASE_PATH}")
 プライベート文字列 FTP_BASE_PATH;
 @Value("${IMAGE_BASE_URL}")
 プライベート文字列 IMAGE_BASE_URL;
 /**
 * 画像をアップロード * @param inputStream 入力ストリーム * @param name ファイル名 * @return 画像のURL
 * @throws IOException IO例外 */
 パブリック String uploadImage(InputStream inputStream、String name) は IOException をスローします {
 FTPクライアント ftpClient = 新しいFTPクライアント();
 試す {
  System.out.println(FTP_ADDRESS);
  ftpClient.enterLocalPassiveMode();
  ftpClient.connect(FTP_ADDRESS、FTP_PORT);
  ftpClient.login(FTP_USERNAME、FTP_PASSWORD);
  ftpClient.changeWorkingDirectory(FTP_BASE_PATH);
  ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  ブール値 isSucceed = ftpClient.storeFile(name, inputStream);
  if (isSucceed){
  IMAGE_BASE_URL + 名前を返します。
  }
 }catch (例外 e){
  e.printStackTrace();
 }ついに {
  ftpClient.logout();
 }
 IMAGE_BASE_URL + "エラー" を返します。
 }
}

次に、サービス処理ロジックでは、コードの一部のみがここに表示されます。

オートワイヤード
 プライベート FtpUtil ftpUtil;

 @オーバーライド
 パブリック int insertImg(MultipartFile ファイル) は IOException をスローします {
 /*
 1. アップロードされたファイルストリーム inputStream とファイル名 getOriginalFilename を取得します。
 2. FtpUtil の関数を呼び出して画像を画像サーバーにアップロードし、https アドレスを返します 3. 画像アドレスが返された場合は、それをデータベースに挿入します */
 入力ストリーム inputStream = file.getInputStream();
 文字列ファイル名 = file.getOriginalFilename();
 文字列 picUrl = ftpUtil.uploadImage(inputStream, ファイル名);
 }

これで完了です。今後クライアントがリクエストしたときに、FTP 経由でサーバーに転送され、アドレスがデータベースに保存されます。フロントエンドが画像の URL を取得すれば、表示されます。

要約する

これで、Docker で Nginx イメージ サーバーを構築する方法についての記事は終了です。Docker で Nginx イメージ サーバーを構築する方法についての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 3つのDocker Nginxログの処理の詳細な説明
  • 負荷分散と動的および静的分離操作を実現するDocker NginxコンテナとTomcatコンテナ
  • Dockerはnginxをデプロイし、フォルダとファイル操作をマウントします
  • Docker nginxは1つのホストを実装して複数のサイトを展開します
  • Docker デプロイメント nginx 実装プロセスのグラフィックとテキストによる詳細な説明
  • Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法
  • Docker ベースの nginx ファイル サーバーを構築する方法と手順
  • Docker Nginxコンテナの制作と展開の実装方法

<<:  Vue2.x の応答性の簡単な説明と例

>>:  MySQLの詳細な説明Explain

推薦する

Vue3 Vue CLI マルチ環境設定

目次1. はじめに2. 切り替え1. 開発および本番環境の設定ファイルを追加する2. 複数の環境をサ...

Canonical が Flutter で Linux デスクトップ アプリを有効化 (推奨)

Google の Flutter の目標は、どのプラットフォームを使用していても、ネイティブの速度...

Centos7 で ZooKeeper3.4 ミドルウェアを構築するための一般的なコマンドの概要

1.ダウンロードして解凍する1. Zookeeperの紹介分散サービス フレームワークとして、Zoo...

ドラッグフォトウォールを実現するネイティブJS

この記事では、ネイティブ JS で実装されたドラッグ可能な写真ウォールを紹介します。効果は次のとおり...

MySQLクエリ条件のnot inとinの違いと理由

まずSQLを書く SELECT DISTINCT from_id タラから cod.from_id ...

docker を使用して crownblog プロジェクトを Alibaba Cloud にデプロイする方法

フロントエンドプロジェクトのパッケージ化.env.productionを見つけて、自分のIPまたはド...

MySQL 起動時に報告される ERROR:2002 の分析と解決方法

序文この記事は主にMySQL起動エラー2002の分析と解決方法を紹介しています。参考と勉強のために共...

mysqlタイムスタンプの使用

序文:タイムスタンプ フィールドは、MySQL でよく使用されます。たとえば、データ行が作成または変...

サーバーの購入と初期構築方法

しばらくサーバーいじってなかったけど、やることがなくなったのでモバイルワークスに行って海外サーバーを...

MySQL 8.0 再帰クエリの簡単な使用例

序文この記事では、MySQL 8.0 の新機能を使用して再帰クエリを実装します。詳細なサンプル コー...

MySQLが基礎データ構造としてB+ツリーを使用する理由

MySQL の基盤となるデータ構造が B+ ツリーであることは誰もが知っていますが、ではなぜ赤黒ツリ...

Linux+ApacheサーバURLの大文字と小文字の区別の問題を解決する

今日、問題が発生しました。ブラウザのアドレスバーにURLアドレスを入力する際、ページを正常にアクセス...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

Linux と Windows でスケジュールされたタスクを設定する方法

目次リナックス1. crontabの基本的な使い方2. ログを有効にする3. スケジュールされたタス...

VMware Workstation Pro 16 グラフィックチュートリアル (CentOS8 仮想マシン クラスタの構築)

目次準備VMware Workstation Pro 16 をインストールするLinux仮想マシンの...