準備。
プロジェクトの稼働中のサーバーのすべての設定を、サーバー構成(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_packetに増やすことができます。
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が適切に構成されている場合、パフォーマンスに大きな違いはないという意見があります。
サーバーのセキュリティとパフォーマンスに特に注意を払いたいので、エラーや欠落を見つけた場合はコメントに書いてください。必要に応じて記事を修正します。