Nginx + LAMP(CentOS 7)のインストールと最適な構成

最近、ホスティングからVPSに移行することにしました。CentOS7、Nginx、Apache、PHP、MySQLを使用します。 このトピックに関する記事は多数ありますが、多くの側面については言及されていないため、この記事を投稿して知識のある経験豊富な人々の意見を聞きます。 すでに理解したとおりにサーバーを構成するため、コメントから記事の関連性を判断できます。 Nginxは、サーバーの負荷を減らすために、静的およびApacheダイナミクス(PHPスクリプト)を提供します。



準備。



プロジェクトの稼働中のサーバーのすべての設定を、サーバー構成(CPU-2×2000 MHzおよびRAM-2048 MB)で適用します。



開始するには、CentOS 7がプリインストールされた適切なVPSを見つけ、 PuTTY経由でSSH経由でサーバーに接続します。



ホスト名とポートを入力して、[開く]をクリックします。



画像



次に、ログイン[Enter]を入力し、次にパスワードを入力します(パスワードは表示されないことに注意してください)[Enter]:





パッケージの古いバージョンを維持しながら、システムを更新します。

[root@test ~]# yum update





または、すべてのパッケージを更新すると、古いパッケージが削除されます。

[root@test ~]# yum upgrade





テキストインターフェースでファイルマネージャーをインストールする-Midnight Commander:

[root@test ~]# yum install mc





テキストエディタ-Nanoをインストールします。

[root@test ~]# yum install nano





サーバーで使用可能なRAMの量と使用可能な量、およびSWAPの存在を確認します。 RAMが不足すると、データがディスクに転送され、サーバーの速度が低下します。SWAPは望ましくありませんが、次のことを保証できます。

[root@test ~]# free -m





サイトのファイル構造とユーザーを作成します。



すべてのサイトのファイル用のディレクトリ(フォルダー)を作成します。

[root@test ~]# cd /

[root@test ~]# mkdir -m 755 website






個々のサイトの下で、次の手順を実行します。



各サイトのコンテンツは独自のディレクトリにあるため、アクセス権を区別するために新しいユーザーと個別のディレクトリを作成します。

-bユーザーディレクトリが作成されるフォルダー

-mディレクトリを作成します

-Uユーザーと同じ名前のグループを作成します

-s / bin / falseユーザーシェルを無効にします

[root@test ~]# useradd name.site -b /website/ -m -U -s /bin/false





サイトデータ(サイトファイル、ログ、一時ファイル)のディレクトリを作成します。

[root@test ~]# mkdir -p -m 754 /website/name.site/www

[root@test ~]# mkdir -p -m 754 /website/name.site/logs

[root@test ~]# mkdir -p -m 777 /website/name.site/tmp






所有者とグループをサブフォルダーを含むディレクトリに変更します。

[root@test ~]# chown -R name.site:name.site /website/name.site/





ディレクトリへのアクセス権を変更します-name.site:

[root@test ~]# chmod 755 /website/name.site





Nginxをインストールします。



インストール手順は、 Nginxの公式Webサイトで提供されています。



CentOSでyumリポジトリを構成するには、ファイル/etc/yum.repos.d/nginx.repoを作成します。

[root@test ~]# cd /etc/yum.repos.d

[root@test ~]# touch nginx.repo






nginx.repoファイルを開きます。

[root@test ~]# nano /etc/yum.repos.d/nginx.repo





このコンテンツを貼り付けてファイルを保存します。

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/7/$basearch/

gpgcheck=1

enabled=1






署名を確認するには、キーをダウンロードして、rpmパッケージマネージャーにインポートします。

[root@test ~]# rpm --import http://nginx.org/keys/nginx_signing.key





Nginxをインストールします。

[root@test ~]# yum install nginx





以下を開始します。

[root@test ~]# systemctl start nginx.service





画像



一時停止:

[root@test ~]# systemctl stop nginx.service





ApacheとPHPをインストールします。



Apacheをインストールします(CentOS-httpd上):

[root@test ~]# yum install httpd





PHPをインストールします。

[root@test ~]# yum install php





Apacheを起動します。

[root@test ~]# systemctl start httpd.service





画像

一時停止:

[root@test ~]# systemctl stop httpd.service





Nginxを構成します。



スタートアップに追加:

[root@test ~]# systemctl enable nginx.service





メイン構成ファイルを開きます。

[root@test ~]# nano /etc/nginx/nginx.conf





編集して保存します:

/etc/nginx/nginx.conf
user nginx;

worker_processes 2;

pid /var/run/nginx.pid;



events {

worker_connections 1024;

multi_accept on;

}



http {

error_log /var/log/nginx/error.log warn;

access_log off;



charset utf-8;

server_tokens off;



include /etc/nginx/mime.types;

default_type application/octet-stream;



reset_timedout_connection on;

client_header_timeout 15;

client_body_timeout 30;

send_timeout 15;

keepalive_timeout 5;

keepalive_requests 30;

client_max_body_size 8m;



limit_rate_after 30M;

limit_rate 500K;



open_file_cache max=10000 inactive=3m;

open_file_cache_min_uses 2;

open_file_cache_valid 1m;



sendfile on;

tcp_nodelay on;

tcp_nopush on;



include /etc/nginx/conf.d/*.conf;

}








Nginxを起動するユーザー:

user nginx;





ワークプロセスの数を示します(プロセッサコアの数とハードディスクの数に依存します。ディスクヘッドは高速に移動できないためです)。

worker_processes 2;





実行中のサーバーのプロセスID:

pid /var/run/nginx.pid;





イベントセクション:

events {

#

}






イベントブロック内で、サーバーへの同時接続の最大数(worker_processes×worker_connections):

worker_connections 1024;





イベントブロック内で、可能な限り接続を受け入れます。

multi_accept on;





httpセクション、残りはその中にあります:

http {

#

}






指定されたパスでログエラー(レベル:警告、エラー、クリティカル、アラート):

error_log /var/log/nginx/error.log warn;





アクセスログエントリを無効にします(ハードドライブは「ありがとう」と言います):

access_log off;





デフォルトのエンコードを設定します。

charset utf-8;





Nginxバージョンの表示をオフにします。

server_tokens off;





MIMEタイプを接続します。

include /etc/nginx/mime.types;





ファイルのMIMEタイプを判別できない場合、デフォルトではファイルはバイナリになります。

default_type application/octet-stream;





クライアントが応答しない場合、接続を閉じます。

reset_timedout_connection on;





クライアント要求ヘッダーを15秒以内で読み取ります。

client_header_timeout 15;





クライアント要求本文を30秒以内で読み取ります-間隔は、要求本文の転送全体ではなく、2つの連続した読み取り操作の間でのみ設定されます。

client_body_timeout 30;





クライアントが15秒以上応答を受け入れない場合、接続をリセットします。

send_timeout 15;





5秒以内で接続を開いたままにします。

keepalive_timeout 5;





1つのクライアントからのオープン接続要求の最大数:

keepalive_requests 30;





8メガバイトを超えるリクエストは受け付けません。

client_max_body_size 8m;





1人のユーザーが無料のトラフィックチャネル全体を占有しないように、30 MB後にデータ出力の速度に制限を課します。

limit_rate_after 30M;





制限後の1つの接続内でのクライアントの最大速度は500 Kb / s以下になります。

limit_rate 500K;





ファイルの最大数を設定します。ファイルに関する情報はキャッシュに格納され、3分以内にファイルが再度要求されない場合は削除されます。

open_file_cache max=10000 inactive=3m;





ファイルが2回以上要求された場合、キャッシュに入れます:

open_file_cache_min_uses 2;





キャッシュの関連性を1分ごとに確認します。

open_file_cache_valid 1m;





仲介なしで静力学を与える:

sendfile on;





データをバッファリングしないでください:

tcp_nodelay on;





1つのバッチでヘッダーを送信します。

tcp_nopush on;





接続設定:

include /etc/nginx/conf.d/*.conf;





サイトごとに、仮想Nginxホストを作成します。



Nginxがサイトファイルにアクセスできるようにするには、nginxユーザーをname.siteグループに追加します。

[root@test ~]# usermod -a -G name.site nginx





次に、構成ファイルを作成します。

[root@test ~]# touch /etc/nginx/conf.d/name.site.conf





ファイルを開きます。

[root@test ~]# nano /etc/nginx/conf.d/name.site.conf





編集して保存します:

/etc/nginx/conf.d/name.site.conf
server {

listen 80;

server_name name.site www.name.site;

#access_log /website/name.site/logs/nginx_access.log;

error_log /website/name.site/logs/nginx_error.log;



location / {

proxy_pass http://127.0.0.1:8080/;

proxy_read_timeout 300s;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_buffering off;

}



location ~* \.(css|js|png|gif|jpg|jpeg|ico)$ {

root /website/name.site/www;

expires 1d;

}



error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /usr/share/nginx/html;

}

}








サーバーはポート80でリッスンします。

listen 80;





サーバー名は、リクエストが実行されるブロックを決定し、ドメイン名が示されます。

server_name name.site www.name.site;





特定のサイトのNginxエラーログへのパス:

error_log /serves/name.site/logs/nginx_error.log;





Apacheリクエストのリダイレクト:

proxy_pass http://127.0.0.1:8080/;





Apacheサーバーから応答を読み取るときにタイムアウトを超えた場合、300秒後に接続を切断します。

proxy_read_timeout 300s;





ヘッダーを渡す:

proxy_set_header Host $host;





クライアントIPの転送:

proxy_set_header X-Real-IP $remote_addr;





要求が行われたサーバーのリストを送信し、独自のサーバーを追加します。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;





プロキシサーバーのバッファリングを無効にします。

proxy_buffering off;





Nginxは統計を提供します:

location ~* \.(css|js|png|gif|jpg|jpeg|ico)$ {

root /serves/name.site/www;

expires 1d;

}






Apacheを構成します。



インストールしたApacheモジュールを確認します。 私はapache2-mpm-preforkを持っています(1つのスレッドを持つ1つのプロセスが1つの接続を処理します、PHPと一緒に安全であることが推奨されます):

[root@test ~]# apachectl -V





httpd.confを開きます。

[root@test ~]# nano /etc/httpd/conf/httpd.conf





編集して保存します:

httpd.conf
ServerRoot "/etc/httpd"

DocumentRoot "/website"

Include conf.modules.d/*.conf



User apache

Group apache



Listen 127.0.0.1:8080

ServerName 127.0.0.1:8080

ServerAdmin root@localhost



ServerSignature Off

ServerTokens Prod



RLimitMEM 786432000

TimeOut 250



AddDefaultCharset utf-8

DefaultLanguage ru



KeepAlive Off

ContentDigest Off

EnableSendfile off



ErrorLog "logs/error_log"

LogLevel error



<IfModule mime_module>

TypesConfig /etc/mime.types

</IfModule>



<Directory />

DirectoryIndex index.php

AllowOverride none

Require all denied

</Directory>



<IfModule mpm_prefork_module>

StartServers 5

MinSpareServers 5

MaxSpareServers 10

MaxClients 30

MaxRequestsPerChild 2500

</IfModule>



<Files ".ht*">

Require all denied

</Files>



IncludeOptional sites-enabled/*.conf









Apacheルートディレクトリをインストールします。

ServerRoot "/etc/httpd"





サイトファイルが保存されるディレクトリ:

DocumentRoot "/website"





設定ファイルをロードします:

Include conf.modules.d/*.conf





サーバーを起動するユーザー:

User apache





サーバーを起動するグループ:

Group apache





要求を受け入れるIPとポートを指定します;外部からは、このサーバーは表示されません:

Listen 127.0.0.1:8080





自己決定のためのホスト名とポート:

ServerName 127.0.0.1:8080





エラーが発生した場合にクライアントに送信されるメールアドレス:

ServerAdmin root@localhost





システムとApacheサーバーのバージョン情報の送信を無効にします。

ServerSignature Off





ヘッダーでApacheに関するクライアント情報の送信を無効にします。

ServerTokens Prod





メモリ使用量を750メガバイトに制限します。

RLimitMEM 786432000





リクエストの受信、処理、コンテンツのNginxサーバーへの送信の最大時間:

TimeOut 250





エンコードを設定します。

AddDefaultCharset utf-8





コンテンツの言語を設定します。

DefaultLanguage ru





1つの接続で多数のリクエストの処理をオフにします。

KeepAlive Off





Content-MD5 HTTPヘッダーの生成をオフにします。

ContentDigest Off





Apacheはstaticを提供しないため、切断します。

EnableSendfile off





指定されたパス/ etc / httpd / logs / error_logにApacheエラーを書き込みます。

ErrorLog "logs/error_log"





エラーを記録するレベルを示します。

LogLevel error





MIMEタイプを接続します。

<IfModule mime_module>

TypesConfig /etc/mime.types

</IfModule>







ディレクトリセクション:

<Directory />

...

</Directory>







Directoryブロック内で、ディレクトリへのパスが指定されている場合、index.phpを指定します::

DirectoryIndex index.php





Directoryブロック内で、.htaccessのアクセス情報の上書きを禁止します。

AllowOverride none





ディレクトリブロック内で、サーバーファイルへのアクセスを拒否します。

Require all denied





Mpm_prefork_moduleセクション:

<IfModule mpm_prefork_module>

...

</IfModule>






Apacheを起動した後、mpm_prefork_moduleブロック内に5つのプロセスを作成します。

StartServers 5





mpm_prefork_moduleブロック内の未使用プロセスの最小数(すべてのプロセスがビジーの場合、新しい空きプロセスが開始されます):

MinSpareServers 5





mpm_prefork_moduleブロック内では、未使用(スペア)プロセスの最大数は次のとおりです。

MaxSpareServers 10





同時に開始できる子プロセスの最大数であるmpm_prefork_moduleブロック内で、残りはキューに入れられます(子プロセスの増加に伴い、メモリ消費が増加します)。

MaxClients 30





mpm_prefork_moduleブロック内で、指定された数のリクエストが処理された後、プロセスが再起動します(オーバーフロー時に必要-メモリリーク):

MaxRequestsPerChild 2500





.htaccessへの近接アクセス:

<Files ".ht*">

Require all denied

</Files>






設定ファイルをロードします:

IncludeOptional sites-enabled/*.conf





各サイトに対して、Apache仮想ホストを作成します。



各サイトのグループにapacheユーザーを追加します。

[root@test ~]# usermod -a -G name.site apache





Apache仮想ホスト構成ファイル用のディレクトリを作成します。

[root@test ~]# mkdir /etc/httpd/sites-enabled





構成ファイルを作成します。

[root@test ~]# touch /etc/httpd/sites-enabled/name.site.conf





ファイルを開きます。

[root@test ~]# nano /etc/httpd/sites-enabled/name.site.conf





編集して保存します:

/etc/httpd/sites-enabled/name.site.conf
<VirtualHost *:8080>

ServerName name.site

ServerAlias www.name.site



DocumentRoot /website/name.site/www



<Directory "/website/name.site">

AllowOverride None

Require all granted

</Directory>



DirectoryIndex index.php



ErrorLog /website/name.site/logs/error.log

CustomLog /website/name.site/logs/requests.log combined

</VirtualHost>











VirtualHostブロック、リッスンするポートが示されます。

<VirtualHost *:8080>

...

</VirtualHost>







ドメイン名:

ServerName name.site





ドメインミラー:

ServerAlias www.name.site





このサイトのファイルが保存されるディレクトリ:

DocumentRoot /website/name.site/www





サイトファイルを共有する:

Require all granted





ディレクトリへのパスが指定されている場合、デフォルトで以下を開きます。

DirectoryIndex index.php





特定のサイトのApacheエラーログへのパス:

ErrorLog /website/name.site/logs/error.log





アクセスログパス:

CustomLog /website/name.site/logs/requests.log combined





NginxとApacheの確認。



Apacheをスタートアップに追加します。

[root@test ~]# systemctl enable httpd.service







ファイルを作成、編集、保存します。

[root@test ~]# touch /website/name.site/www/index.php

[root@test ~]# nano /website/name.site/www/index.php







php設定をコピーします。

[root@test ~]# cp /etc/httpd/conf.d/php.conf /etc/httpd/sites-enabled/php.conf







NginxとApacheを起動します。

[root@test ~]# systemctl start nginx.service

[root@test ~]# systemctl start httpd.service







PHPを構成します。



php.iniを開きます。

[root@test ~]# nano /etc/php.ini





編集して保存します:

/etc/php.ini
engine = On

expose_php = Off

short_open_tag = Off

zlib.output_compression = Off

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc



display_startup_errors = Off

display_errors = Off

log_errors = On

error_log = "/usr/local/zend/var/log/php.log"

ignore_repeated_errors = Off

ignore_repeated_source = Off

html_errors = On



implicit_flush = Off

output_buffering = 4K

realpath_cache_size = 2M

realpath_cache_ttl = 1800

zend.enable_gc = On



max_input_time = 200

max_execution_time = 30

file_uploads = On



memory_limit = 256M

post_max_size = 8M

upload_max_filesize = 2M

max_file_uploads = 4



extension_dir = "/usr/local/zend/lib/php_extensions"

date.timezone = Europe/Moscow

default_mimetype = "text/html"

default_charset = "UTF-8"



variables_order = "CGPS"

register_argc_argv = Off

auto_globals_jit = On

enable_dl = Off



allow_url_fopen = On

allow_url_include = Off








PHPインタープリターをオンにします。必要に応じて、特定のサイトでオフにすることができます。

engine = On





PHPについてクライアントに送信されるヘッダーを無効にします。

expose_php = Off





PHPタグの短い書き込みを無効にする<?...?>:

short_open_tag = Off





ページの圧縮をオフにします。

zlib.output_compression = Off





危険な機能を無効にします。

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc





PHPの起動中に発生したエラーを表示しないでください。

display_startup_errors = Off





エラーを表示しない:

display_errors = Off





ディスプレイをオフにした後のエラーを記録します。

log_errors = On





エラーが書き込まれるファイル:

error_log = "/usr/local/zend/var/log/php.log"





特定のファイルおよび行で発生する同じエラーを記録しないでください(ignore_repeated_source-オフにする必要があります)。

ignore_repeated_errors = Off





オンにすると、異なるファイルや行で発生する可能性のある同じエラーは記録されないため、オフにします。

ignore_repeated_source = Off





エラーメッセージを表示するときにHTMLタグをオフにします。

html_errors = On





データをバッファに追加します。

implicit_flush = Off





すべてのファイルの出力バッファリング 、最大数:

output_buffering = 4K





realpath cacheを使用して stat()の呼び出し回数を減らします:

realpath_cache_size = 2M





キャッシュストレージ時間を30分に設定します。

realpath_cache_ttl = 1800





循環リンクのコレクターが含まれます。

zend.enable_gc = On





サーバーでデータを受信する最大時間(POST、GET、HEAD)を示します。この時間は、PHPの開始からスクリプトが実行されるまでの時間です。

max_input_time = 200





スクリプトの最大実行時間を指定します(値はApacheの場合よりも大きくありません-タイムアウト) -set_time_limitの代わりに:

max_execution_time = 30





サーバーへのファイルのアップロードを許可します。

file_uploads = On





スクリプトが使用できる最大メモリサイズ:

memory_limit = 256M





POSTメソッドによって送信されるデータの最大サイズ(以下の値-memory_limit)。

post_max_size = 8M





アップロードされたファイルの最大サイズ(post_max_sizeより小さい必要があります):

upload_max_filesize = 2M





1つのリクエストで転送できるファイルの数:

max_file_uploads = 4





拡張モジュールがあるディレクトリへのパス:

extension_dir = "/usr/local/zend/lib/php_extensions"





タイムゾーンを設定します。

date.timezone = Europe/Moscow





データ型:

default_mimetype = "text/html"





エンコーディングUTF-8を設定します。

default_charset = "UTF-8"





変数の処理順序は、$ _COOKIE、$ _GET、$ _POST、$ _SERVERです。

variables_order = "CGPS"





argvおよびargc変数を宣言しないでください。

register_argc_argv = Off





使用時にSERVERおよびENV変数が作成されるため、パフォーマンスが向上します。

auto_globals_jit = On





動的読み込みをオフにすると、セキュリティに影響します。

enable_dl = Off





URLによる外部ファイルの操作を許可します。

allow_url_fopen = On





外部ファイルの使用を無効にします。

allow_url_include = Off





MySQLをインストールして構成します。



my.cnfを切り離します。

[root@test ~]# nano /etc/mysql/my.cnf





競合するMySQLクエリを処理する並列プロセスの数(コアの数に2を掛けたもの):

thread_concurrency = 4





新しいテーブルのデフォルトエンコーディングを設定します。

default-character-set = utf8





InnoDBテーブルを使用します。

default-storage-engine = InnoDB





RAMのテーブルのインデックス用のバッファのサイズを設定します(MyISAMテーブルに関連):

key_buffer_size = 5M





バッファーデータとテーブルインデックス-InnoDB:

innodb_buffer_pool_size = 300M





MySQLによって作成された一時テーブルに割り当てられるRAMの最大サイズ:

tmp_table_size = 50M





キャッシュ内にあるオープンテーブルの最大数:

table_open_cache = 64





情報をディスクに書き込むために使用されるデータバッファーはInnoDBです。

innodb_log_buffer_size = 0M





クエリキャッシュをオフにします

query_cache_size = 0





各ストリーム内のデータのソート(ORDER BY)またはグループGROUP BY)に使用されるバッファーのサイズ:

sort_buffer_size = 512K





各スレッドの各テーブルにメモリを割り当てますが、この値を大きくすると、クエリの実行速度が低下する可能性があります。

read_buffer_size = 512K





-ORDER BYを使用したクエリのソート速度に影響します。

read_rnd_buffer_size = 1M





これらのクエリでインデックスが使用されていない場合、JOINを使用したバッファサイズ:

join_buffer_size = 2M





スタックサイズ、タスクのリストを保存する場所(テーブルの開閉、リクエストの実行など):

thread_stack = 1M





接続バッファとその結果にメモリを割り当て、max_allowed_pa​​cketに増やすことができます。

net_buffer_length = 30K





1つのリクエストで転送できるデータの最大サイズ:

max_allowed_packet = 5M





同時接続の最大数:

max_connections = 75





キューに入れることができる接続の数:

back_log = 250





ローカルホストのみをリッスンする:

bind-address = 127.0.0.1





TCP / IP接続を使用せず、ソケットを介してデータを転送します。

skip-networking





MySQLサーバーでのおおよそのメモリ消費量を計算するには(理解したとおり)、次の式を使用できます(Apacheサーバーには既に750 MBが割り当てられており、Nginxサーバーに任せる必要があることを忘れないでください):

key_buffer_size + innodb_buffer_pool_size + tmp_table_size + ((sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack) × max_connections) = ?





セキュリティについて少し。



ルートとしてログインすることは望ましくないため、新しいユーザーを作成します。

[root@test ~]# adduser newuser





ユーザーのパスワードを設定します-newuser:

[root@test ~]# passwd newuser





sudoパッケージをインストールします。

[root@test ~]# yum install sudo





新しいユーザーをsudoに追加します。

[root@test ~]# gpasswd -a newuser wheel





ポート22を介してSSHに接続する場合は、変更する必要があり、sshd_configを開きます。

[root@test ~]# nano /etc/ssh/sshd_config





ポートを空きポートに変更します(コンピューターにインストールされているファイアウォールを介してポート22を閉じ、54139などの新しいポートを開くことを忘れないでください)。

Port 54139





空のパスワードでのログイン試行を禁止します。

PermitEmptyPasswords no





ルートログインを拒否します。

PermitRootLogin no





新しいユーザーのみが端末にログインできるようにします-

newuser:

AllowUsers newuser





sshを再起動します。

[root@test ~]# service sshd restart







PS Nginxはphp-fpmで使用できますが、Apacheが適切に構成されている場合、パフォーマンスに大きな違いはないという意見があります。



サーバーのセキュリティとパフォーマンスに特に注意を払いたいので、エラーや欠落を見つけた場合はコメントに書いてください。必要に応じて記事を修正します。



All Articles