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

推薦する

WeChatアプレットは画像コントロールを選択します

この記事の例では、WeChatアプレットで画像コントロールを選択するための具体的なコードを参考までに...

ボックスモデルのサイズの詳細な説明は、パディング、マージン、境界の値によって異なります。

ボックス モデルは、要素ボックスの幅と高さ、パディング、境界線、余白のサイズを指定します。境界線の内...

jsは前のページに戻り、コードを更新します

1. Javascript は前のページ history.go(-1) に戻り、2 つのページを返し...

Docker ベースの ELK を素早く構築する方法

[概要] この記事では、自作の Docker プラットフォームをベースに完全な ELK システムを素...

Webpack プロジェクトでローダー プラグインをデバッグする方法

最近、webpackの使い方を学んでいたときに、webpack-replace-loaderの設定正...

JavaScriptでマクロを使用する方法

言語では、DSL を実装するためにマクロがよく使用されます。マクロを使用すると、開発者は JSX 構...

docker mysqlの起動時に初期化SQLを実行する

1.Mysqlイメージを取得するdocker pull mysql:5.7 2. MySQLイメージ...

vuex データの永続化のための 2 つの実装ソリューション

目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...

Reactの仮想DOMとdiffアルゴリズムの詳細な説明

仮想DOMの役割まず、仮想 DOM の出現によってどのような問題が解決されるのかを知る必要があります...

MySQL の組み込み関数 find_in_set を使用した効率的なあいまい検索の詳細な説明

一般的に使用される方法は次の 4 つです。 1.locate()メソッドを使用する一般的な使用法: ...

Linux での sshd サービスとサービス管理コマンドの詳細な説明

sshd SSH は Secure Shell の略で、アプリケーション層のセキュリティ プロトコル...

Apache Spark 2.0ジョブは完了するまでに長い時間がかかります

現象Apache Spark 2.x を使用すると、Spark ジョブがすべて完了しているにもかかわ...

Bツリー挿入プロセスの概要

前回の記事 https://www.jb51.net/article/154153.htm では、B...

Vueはユーザーログイン切り替えを実装します

この記事では、ユーザーのログイン切り替えを実現するためのVueの具体的なコードを例として紹介します。...

OCSP を有効にすると、https 証明書の検証効率が向上し、Let's Encrypt SSL 証明書へのアクセスが遅くなる問題が解決されます。

ここ数日、ウェブサイトを初めて開いたときにアクセスが非常に遅いのですが、その後はページが正常に開きま...