RoRアプリケーション用のMinioとNginxの構成

Minio-それは何ですか



Minioは、シンプルで高速なAWS S3準拠のオブジェクトストレージです。 Minioは、写真、ビデオ、ログファイル、バックアップ、仮想マシンやコンテナの画像などの非構造化データをホストするように設計されています。 サイズが小さいため、Node.js、Redis、MySQLと同様に、アプリケーションスタックに含めることができます。 Minioは分散モードもサポートしています。これにより、複数のドライブを、異なるマシンにあるドライブを含む同じストレージサーバー上のオブジェクトに接続できます。







Minioのインストール



サーバーのインストール



Minioのインストールと実行は非常に簡単です。







brew install minio/stable/minio minio server ~/data
      
      





ドキュメントがアドバイスするように、以前のバージョンが安定性を示すことなく以前にインストールされた場合、それを削除して新しい安定版をインストールする必要があります。







 brew uninstall minio brew install minio/stable/minio
      
      





サーバーコマンドのヘルプには、起動と構成の基本的な方法が表示されます。 ローカルで実行します







 minio server --address localhost:9000 ~/data
      
      





サーバーを起動した後、彼は見つけられるアドレスと、それにアクセスするための秘密のパスワードを持つキーを書き込みます。 これは、原則として、Minioの使用を開始するのに十分です。詳細- 公式ドキュメント







クライアントのインストールと基本的なコマンド



Minioクライアントを使用すると、Unixコマンドラインと同様のストレージを操作できます。 クライアントを置いてチームを見る







 brew install minio/stable/mc mc --help
      
      





有用から:







 mc mb minio/my-uploads-store #   mc policy -r public minio/my-uploads-store #      mc ls minio/my-uploads-store #      
      
      





公式リファレンスガイドでは、すべてが十分に詳細に説明されています







Nginx



基本設定



Nginxは多くの便利なことを行います。例えば:









Minioを使用するための最も簡単なNginxセットアップ







 server { listen 80; server_name minio.dev; location / { proxy_set_header Host $http_host; proxy_pass http://localhost:9000; } }
      
      





これでminio.devのリポジトリにアクセスできます







キャッシング



記事で説明されているように、NginxのMinioキャッシングに問題がありました。 判明したように -私だけではありません。 次のようにねじを外します。









ストレージ部分のNginx構成
 proxy_cache_path /var/cache/nginx/minio_cache levels=1:2 keys_zone=minio_cache:10m max_size=10m inactive=60m use_temp_path=off; upstream minio_servers { #       Load Balancing server localhost:9000; } server { listen 80; server_name minio.dev; location / { proxy_cache minio_cache; add_header X-Cache-Status $upstream_cache_status; proxy_cache_revalidate on; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; proxy_ignore_headers Set-Cookie; proxy_cache_valid 1m; proxy_set_header Host $http_host; proxy_pass http://minio_servers; } }
      
      





RoRアプリケーション



一般設定



Shrineを使用してMinioに写真をアップロードします(作業のすべての詳細は、公式の優れたドキュメントおよびドキュメントに添付されている記事で確認できます。ここにMinioの機能のみを示します)。 Minioを直接使用するには、Gemfileに追加する必要があります







 gem 'shrine-fog' gem 'fog-aws'
      
      





config / initializers / shrine.rb
 require 'shrine/storage/fog' require 'fog/aws' require 'image_processing/mini_magick' minio = Fog::Storage.new( provider: 'AWS', aws_access_key_id: '<key>', aws_secret_access_key: '<secret>', region: 'us-east-1', endpoint: 'http://localhost:9000/', #     path_style: true, ) Shrine.storages[:cache] = Shrine::Storage::Fog.new( connection: minio, directory: '<cache-directory>', public: true, ) Shrine.storages[:store] = Shrine::Storage::Fog.new( connection: minio, directory: '<store-directory>', public: true, )
      
      





もちろん、Minioクライアントを介して適切なフォルダーを作成し、それらへのフルアクセスを与える必要があります(上記のセクション-Minioクライアントを参照)。







app / models / avatar_uploader.rb
 class AvatarUploader < Shrine include ImageProcessing::MiniMagick plugin :activerecord plugin :determine_mime_type, analyzer: :mime_types plugin :logging, logger: Rails.logger plugin :remove_attachment plugin :store_dimensions plugin :remote_url, max_size: 20*1024*1024 plugin :versions plugin :default_url plugin :processing plugin :host_url, host: 'minio.dev', port: '80' #   ,    Attacher.default_url do |options| #  ,   '/images/default.svg' end process(:cache) do |io, context| #  ,         resize_to_fill!(io.to_io, 300, 300) end end
      
      





実際、ほとんどのプラグインはオプションです。 詳細については、公式の神社のドキュメントを参照してください。 通常通りの取り扱い:







 User.find(1).avatar_url
      
      





リンク交換



交換用リンクをいじる必要がありました。 Shrineには、ほとんどの問題を解決するために使用できるさまざまなプラグインがあります。 default_url_optionsホストを置き換えるためのプラグインがありますが、この特定のケースでは役に立ちませんでした-ホストを変更し、ポートを無視します。 うーん、どうする? そして、独自のShrineプラグインを作成しましょう。 プラグインコードは、接続方法の下にあります-前のリスト(80番目のポートは、最終リンクでデフォルトで指定されていないため、他のすべてが表示されます。







プラグインコード
 class Shrine module Plugins module HostUrl def self.configure(uploader, options = {}) uploader.opts[:host_url] = (uploader.opts[:host_url] || {}).merge(options) end module FileMethods def url(**options) new_uri( URI.parse(super), uploader.opts[:host_url][:host], uploader.opts[:host_url][:port] ) end private def new_uri(uri, new_host, new_port) URI::HTTP.new( uri.scheme, uri.userinfo, new_host, new_port, uri.registry, uri.path, uri.opaque, uri.query, uri.fragment ).to_s end end end register_plugin(:host_url, HostUrl) end end
      
      





新しいプラグインのコードをlib / shrine / plugins / host_url.rbに配置します







データ移行



公式の指示では、原則として、すべてが詳細に説明されています。 確かに、いくつかのニュアンスがあります-(attacher = user.avatar_attacher).storedがある場合は? 何らかの理由でfalseを返します。小さなこともあります。既存の古いストアに新しいストアを追加し、移行を行ってから古いストアを削除する必要があります。

しかし、この特定のケースでは、すべてをはるかに簡単にすることができます。







 rsync -zavP <>@<.>:/<___> ~/data/<store-directory>
      
      





実際、すぐに使用できるものはすべて新しいコードで機能します。







その他



はい、次のアプリケーションでMinioに移行するときに、このプラグインをgemに転送しました。







使用したソース



NGINX PlusとMinioおよびロシア語翻訳を 備えたエンタープライズグレードのクラウドストレージ








All Articles