HostCMSを実行しているサイト専用のサーバーを構成する

ほとんどすべてのWebプロジェクトの「人生」では、小規模なオンラインストアであろうと人気を博しているバーのWebサイトであろうと、遅かれ早かれ、共有ホスティングに十分な機会とリソースがなく、アプリケーションアーキテクチャを完全に再編成する手段もない瞬間が訪れます。 数年前、私がまだ小さなウェブスタジオで働いていたとき、私はしばしばそのような写真を観察しなければなりませんでした。 このような場合はほとんど、同じ決定が行われました-専用サーバーをレンタルし、その形式でプロジェクトを転送します。 当時、Linuxを搭載したサーバーのセットアップに関する多くの記事がネットワーク上で入手できました。 さらに、それらのほとんどすべてが最高品質のものではなく、オスター氏がそれらの資料の著者に拍手を送ることができるような有害なアドバイスが含まれていることが多かった。



「これらはすべて過ぎ去った時代のものです」-私の古い友人が同様の問題を解決するために私に助けを求めるまで、それは私がちょうど最近思った方法です。 結局のところ、状況はそれほど変わっていません: ドキュメントの必要なセクションは実際には更新されていません。開発者自身は一般に、パートナーからの共有ホスティングの使用を推奨しており、HostCMSの専用プロジェクトサーバーへの移行のニュアンスを考慮した賢明な資料はありませんでした。 私はCMS自体が好きなので、この省略を修正することにしました。 興味があれば、猫へようこそ。



まず、予約。 この記事では、ホスティングプロバイダーを選択する際の問題については検討しません。これは自分で処理できると思います。 Ubuntu Server 14.04は、最も使いやすいサーバーOSとして選ばれました。 Linuxで作業するための最低限の知識があることを前提としています。 残念ながら、ここでは、ファイルへのアクセスなどのユーザー制限を設定するためにPAMモジュールを微調整することはできません。 -もしあなたがそのような資料を探しているなら、おそらくこの記事はあなたにとって退屈でしょう。



最初のステップ



そのため、ssh経由でアクセスする専用サーバーとデータがあります。 最初のルールは、それが主なことであり、特権ユーザーに代わって絶え間ない作業を避けようとします。 最初のセッション中に、独自のアカウントを作成し、そのパスワードを設定します。 たとえば、次のように:



useradd user_name -s /bin/bash -U -m -G sudo passwd user_name
      
      





新しく作成されたユーザーに代わって、さらに作業を行います。



必要なソフトウェアをインストールする



nginx


nginxはHTTPサーバーとして使用されます。 彼は紹介を必要としないと思います。 開発チームが親切にデプロイしたリポジトリからインストールします 。 これを行うには、インストールパッケージに署名したキーを取得する必要があります。



 #          STDOUT #           wget http://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.key rm nginx_signing.key
      
      





次の行を/etc/apt/sources.listファイルに追加して、パッケージソースのリストを更新します。



 # 12.04 = precise # 14.04 = trusty deb http://nginx.org/packages/ubuntu/ trusty nginx deb-src http://nginx.org/packages/ubuntu/ trusty nginx
      
      





その後、nginxを更新してインストールします。



 sudo aptitude update && sudo aptitude upgrade -y sudo aptitude install nginx
      
      





httpサーバーがユーザーとして開くファイルの数に制限を設定するには、/ etc / security / limits.confに次の行を追加します。



 nginx hard nofile 32768 nginx soft nofile 32768
      
      





正確な数は、サーバーの構成に基づいて選択する必要があります。 制限モジュールは、/ etc / pam.d / common-sessionに次の行を追加することにより有効になります:



 session required pam_limits.so
      
      





次のコマンドで制限が設定されていることを確認します。



 sudo su nginx --shell /bin/bash --command "ulimit -a"
      
      





Php


HostCMSでは、次のphpモジュールを有効にする必要があります:curl、gd、xslt、そしてもちろんmysql。 また、php5-jsonパッケージは仮想ではなく、個別にインストールする必要があることに注意してください。 とりわけ、キャッシングモジュールopcode xcacheを接続します。 PHP-FPMをSAPI(インタープリター起動モード)として使用しますが、スケジュールに従っていくつかのスクリプトを実行できるようにするために、PHP-CLIもインストールされます。



 sudo aptitude install php5-common php5-fpm php5-cli php5-curl php5-gd php5-mysql php5-xsl php5-json php5-xcache
      
      





MySQL


MySQLのインストールは非常に簡単です。 インストーラーがデータベースサーバーのルートのパスワードを何度か尋ねてきますが、安全に空のままにしておくことができます-mysql_secure_installationユーティリティを使用して後で変更します。 起動したら、ルートパスワードの変更、テストデータベースとテストユーザーの削除、およびサービスデータベーステーブルの権限の更新を行います。



 sudo aptitude install mysql-server sudo mysql_secure_installation
      
      





mysqlサーバーのセットアップの詳細については、 こちらをご覧ください 。 この記事はよく書かれているので、ここで情報を複製する理由はありません。



ファイルアップロード設定



ファイル転送プロトコルとして、 SSH FTP(SFTP)を使用することをお勧めします 。 まず、データは暗号化された形式で送信されるため、通常のftpよりも安全です。 第二に、追加のソフトウェアをインストールする必要はありません。必要なのはsshサーバーだけです。すでに持っています。 また、実質的にマイナスはありません-最新のIDEおよびデータダウンロードクライアントはすべて、このプロトコルで動作できます。

sftp経由で接続できるユーザーを決定するには、追加のユーザーグループ、たとえばsftpを作成します。



 sudo groupadd sftp
      
      





そして、 / etc / ssh / sshd_configファイルの最後に行を追加して、データ転送をアクティブにします。



 Match Group sftp ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no
      
      







ファイルシステムの準備



従来、Webサイトに関連するファイルは/ var / www /ディレクトリにあります。 そして、この暗黙のルールから逸脱することはありません。 仮想ホストと将来の高速キャッシュマウントポイント用のフォルダーを作成します。



 sudo mkdir -p -m 755 /var/www/data sudo mkdir -m 777 /var/www/tmp
      
      





次に、次回の起動時に、tmpfsがこのフォルダーにマウントされることを示します。 / etc / fstabに追加します。



 tmpfs /var/www/tmp/ tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=128M 0 0
      
      





HostCMSの一部のエディションには、ファイルへの応答をキャッシュするための組み込みアルゴリズムがあることに注意してください。 これらのエディションのいずれかを使用する場合、tmpfsをCMS自体のキャッシュディレクトリにマウントするのが理にかなっています。



仮想ホストを構成する



サーバーでHostCMSを実行している複数のサイトを展開する場合、以下で説明する手順を数回繰り返す必要があります。 この場合、新しいホストを作成するプロセスを自動化することは理にかなっています。 この記事で説明するスクリプトの小さなセットに注意を払い、自分で「仕上げる」ことをお勧めします。



ホストユーザー機関


セキュリティ上の理由から、当社のサイトに関連付けられているすべてのファイルは、システム内の特別に傷ついたユーザーのものです。 sftpを介した接続とPHPスクリプトの実行は、独自に行われます。 簡単にするために、サイトの名前で呼び出すことができます:



 sudo useradd -b /var/www/data -s /usr/lib/sftp-server -m -U -G sftp example.com sudo passwd example.com sudo su example.com --shell /bin/bash --command "mkdir -m 0755 ~/data ~/log && mkdir -m 0777 ~/tmp"
      
      





chrootが正しく機能するためには、rootをこのユーザーのホームディレクトリの所有者にします。



 cd /var/www/data sudo chown root:root example.com
      
      





プール開設PHP-FPM


php-fpmプールは、前の手順で作成したユーザーに代わって起動されます。 フロントエンドサーバーと対話するには、Unixソケットが使用されます。 さらに、リクエストを処理するための実行中のプロセスの数、ロギングのタイプ、およびサイトのその他のphp固有のパラメーターを構成できます。

プール構成の例
 [example.com] user = example.com group = example.com listen = /var/run/php5_example.com.sock listen.backlog = 4096 listen.owner = nginx listen.group = nginx listen.mode = 0660 process.priority = 0 chdir = / pm = dynamic pm.max_children = 64 pm.start_servers = 8 pm.min_spare_servers = 4 pm.max_spare_servers = 16 pm.process_idle_timeout = 60s; pm.max_requests = 256 access.log = /var/www/data/example.com/log/php.access.log access.format = "%R # %{HTTP_HOST}e # %{HTTP_USER_AGENT}e # %t # %m # %r # %Q%q # %s # %f # %{mili}d # %{kilo}M # %{user}C+%{system}C" slowlog = /var/www/data/example.com/log/php.slow.log request_slowlog_timeout = 2s request_terminate_timeout = 300s php_admin_flag[display_errors] = off php_admin_flag[log_errors] = on php_admin_value[error_log] = /var/www/data/example.com/log/php.error.log php_admin_value[memory_limit] = 32M php_admin_value[open_basedir] = /var/www/data/example.com/:. php_admin_value[upload_tmp_dir] = /var/www/data/example.com/tmp php_admin_value[session.save_path] = /var/www/data/example.com/tmp
      
      







仮想ホスト構成の作成


nginxホスト構成ファイルで、サイトのドメイン名、アクセスログを書き込むためのパス、php-fpmがリッスンしているUNIXソケットのアドレスを指定する必要があります。 存在しないファイルへのリクエストを処理するために、名前付きの場所を使用します-このようにして、Apache2のmod_rewrite操作をエミュレートします。 スクリプトを処理のためにバックエンドに渡す前に、その存在を確認します。 これにより、 ここで説明する問題を回避できます 。 未登録ユーザーによるサイトの負荷を軽減するために、nginx側でキャッシュを使用します。 これを行うには、次の内容で構成ファイル/etc/nginx/conf.d/cacheを作成します。



  fastcgi_cache_path /var/www/tmp/cache levels=1:2 keys_zone=cache:32m max_size=128m; fastcgi_temp_path /var/www/tmp/proxy 1 2; fastcgi_ignore_headers Expires Cache-Control; fastcgi_cache_lock on; fastcgi_cache_lock_timeout 60s; fastcgi_cache_use_stale error timeout updating invalid_header; fastcgi_cache_bypass $cookie_PHPSESSID; fastcgi_no_cache $cookie_PHPSESSID; fastcgi_cache_key $scheme$host$request_uri;
      
      





そして、仮想ホスト構成で接続します。



Nginxホスト構成の例
 server { listen 80; server_name example.com www.example.com; access_log /var/www/data/example.com/log/nginx.access.log main; error_log /var/www/data/example.com/log/nginx.error.log; root /var/www/data/example.com/data; error_page 404 /404/; location / { index index.html index.php; try_files $uri $uri/ @hostcms; } # php    php-fpm,     location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php5_example.com.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include /etc/nginx/conf.d/cache; } #  ,     ,   index.php location @hostcms { fastcgi_pass unix:/var/run/php5_example.com.sock; fastcgi_param SCRIPT_FILENAME $document_root/index.php; include fastcgi_params; include /etc/nginx/conf.d/cache; }
      
      







サイトデータベースを作成する


これでほぼすべての準備が整いました。データベースを展開し、そのデータベースに接続するユーザーを作成するだけです。 これを行うには、mysqlコンソールでいくつかの簡単なコマンドを実行します。



 CREATE USER 'example_com'@'localhost' IDENTIFIED BY ''; GRANT USAGE ON * . * TO 'example_com'@'localhost' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS example_com_db DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL PRIVILEGES ON example_com_db . * TO 'example_com'@'%';
      
      





このユーザーに代わって任意のアドレスからデータベースに接続できることに注意してください。

以前に使用したデータベースのダンプがある場合は、次の一連のコマンドを使用して同じmysqlコンソールにすべてデプロイできます。



 use example_com_db; source ;
      
      







バックアップとログローテーションのセットアップ



すべてを正しく行った場合、プロジェクトを起動するための環境がすでに完全に構​​成されているはずです。 リストに残っている最後の2つは、重要ではありませんが、バックアップとログローテーションのセットアップです。 バックアップを作成するためのツールとして、backup-managerを使用することをお勧めします。 habrには素晴らしい記事がありますので、詳しくは説明しません。



ログローテーションを実行するには、logrotateユーティリティの正しい構成を作成するだけです。

例えば、
 /var/www/data/example.com/log/nginx*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root root sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript } /var/www/data/example.com/log/php*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root root postrotate invoke-rc.d php5-fpm reopen-logs > /dev/null endscript }
      
      









結論の代わりに



おそらくこれが私が言いたかったことのすべてです。

おそらく、コントロールパネルのホスティングが支配的であるため、この記事の関連性があまり高くない人がいるかもしれません。 私の意見では、これらはサービスの大量提供に適しており、特定のプロジェクトのサーバー設定を調整することに関してはまったく不適切です。

他の人は少し厄介なことに気づくでしょう。 その可能性はあります。記事では、サーバー管理の分野での混乱した経験を反映しようとしました。

いずれにせよ、この資料が誰かを助けてくれたら嬉しいです。 コメントや追加は大歓迎です。



All Articles