目次
1.Nginxの紹介
1.Nginxの紹介
Nginx (機能: 少ないメモリ使用量、強力な並行性)
Nginx は、高性能の HTTP およびリバース プロキシ サーバーです。
Nginx は、軽量の Web サーバー/リバース プロキシ サーバーおよび電子メールです.
単一の物理サーバーは、30,000 から 50,000 の同時要求をサポートできます.
天銀
Tengine は、Taobao.com が開始した Web サーバー プロジェクトです。Nginxに基づいて、トラフィックの多いWebサイトのニーズに合わせて多くの高度な機能と機能を追加します. Tengine のパフォーマンスと安定性は、Taobao や Tmall などの大規模な Web サイトで十分にテストされています。(このように理解できます: タオバオは Nginx のソース コードを取得した後、機能を追加し、最適化などを行い、公式の Nginx に送信しましたが、公式の Nginx の応答が遅かったり、応答がなかったりしたため
、言語コミュニケーションがスムーズではなく、タオバオ社が独自にパッケージ化し、GPLの原則に従って二次開発を行ったため、現在のバージョンのTengineが出てきました)
注: NG 同時接続機能は 2 つの要因の影響を受けます
1. CPU の数
2. ローカル物理サーバー システム内の最大ファイル数
Apache
Apache はプロセスベースの構造です. プロセスはスレッドよりも多くのシステム オーバーヘッドを消費し, マルチプロセッサ環境には適していません. したがって, Apache Web サイトを拡張するときは, 通常, プロセッサを追加するのではなく, サーバーを増やすか, クラスタ ノードを拡張します. .
2. I/O モデル関連の概念
- Nginx サービスは、非同期のノンブロッキング モードを使用します。リクエストをキューに入れる必要はなく、タスクの完了結果がフィードバックされます。
- Apache サービスは同期ブロッキング モードを使用します。リクエストはキューに入れる必要があり、結果は積極的に返されません。
- 同期/非同期: メッセージ通信メカニズム、つまり、呼び出し元が 1 つの処理結果を待っている場合に焦点が当てられています。呼び出し先が補完を提供するかどうか。
- 同期: 発信者は積極的に結果を求める必要があります。
- 非同期: 呼び出し元は積極的に結果を要求する必要はなく、呼び出し先は積極的に結果を返します。
- ブロッキング: システムは一度に 1 つの要求しか処理できず、他の要求はキューに入れる必要があります。
- ノンブロッキング: システムは複数のリクエストを同時に処理します。
3. Nginx イベント駆動型モデル
1. select : アプリケーション プログラム、プロキシ システム関数は非同期要求を処理し、接続の最大数は 1024 です。
I/O イベントが発生したことのみを認識しますが、それがどのストリームであるかは認識しません (1 つ、複数、またはすべてのストリームが存在する可能性があります) データを見つけるために、すべてのストリームを無差別にポーリングすることしかできません。またはデータを書き込むストリーム、それらを操作します。そのため、select の無差別ポーリングの複雑さは O(n) であり、同時に処理されるストリームが多いほど、無差別ポーリングの時間が長くなります。
2. poll : select の拡張バージョンは、最大接続数 1024 をキャンセルします。
poll は基本的には select と同じで、ユーザーから渡された配列をカーネル空間にコピーし、各 fd に対応するデバイスのステータスを問い合わせますが、接続に基づいて格納されるため、最大接続数に制限はありません。リンクされたリスト。
3. epoll : poll の拡張版。
epoll はイベント ポーリングとして理解できます. ビジー ポーリングや無差別ポーリングとは異なり、epoll は、どのストリームが発生し、どの I/O イベントが発生したかを通知します。したがって、epoll は実際にはイベント駆動型 (各イベントは fd に関連付けられている) であり、これらのストリームに対する操作は現時点で意味があると言えます。
4.NginxとApacheの違い
1. Nginx はイベントよりも Web サーバーです. Apache はプロセスベースのサーバーです.
2. Nginx のすべてのリクエストは 1 つのスレッドで処理されます. Apache シングルスレッドは単一のリクエストを処理します.
3. Nginx はサブプロセスの概念を避けます. Apache はサブプロセスに基づく 4.
メモリ消費と接続の点では Nginx が優れている; メモリ消費と接続の点では Apache が一般的に優れている
5. Nginx のパフォーマンスとスケーラビリティはハードウェアに依存しない; Apache は CPU などのハードウェアに依存するおよびメモリ
6. Nginx はホット デプロイメントをサポートします; Apache はホット デプロイメントをサポートしません
7. Nginx は静的ファイル処理の効率が高くなります; Apache は比較的一般的です
8. Nginx はリバース プロキシ シナリオで明らかな利点があります; Apache は比較的一般的です
一般的に言えば、パフォーマンスを必要とする Web サービスは nginx を使用します。パフォーマンスではなく安定性が必要な場合は、apache を選択してください。
2. Nginx サービスのコンパイルとインストール
1. ファイアウォールをオフにして、インストール済みの Nginx ソフトウェア パッケージを opt ディレクトリにインストールします。
systemctl stop firewalld
systemctl disable firewalld #关闭防火墙
yum -y install pcre-devel zlib-devel gcc gcc-c++ make #安装依赖包
2. Nginx のコンパイルとインストール
cd /opt/
tar zxvf nginx-1.22.2.tar.gz
cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \ #指定Nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启动http_stub_status_module模块,支持状态统计
make -j2 && make install
3. より良い管理のためにユーザーとグループを作成する
(Nginx サービス プログラムは、デフォルトでは nobody として実行されます。アクセス権をより正確に制御するために、特別なユーザー アカウントを作成することをお勧めします) Nginx サービス プログラムは、デフォルトで匿名で実行されます
useradd -M -s /sbin/nologin nginx
4. ソフト接続を作成して開始する
#创建软连接,让系统识别Nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#检查文件是否正确
nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#启动nginx
nginx
#查看是否启动nginx
netstat -antulp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5964/nginx: master
#如果遇到占用80端口的情况我们可以先查看pid号
cat /usr/local/nginx/logs/nginx.pid
netstat -antulp | grep nginx
#在用kill -3命令暂停
kill -3 5964
5.Nginxを停止します
#まずnginxのPID番号を確認
cat /usr/local/nginx/logs/nginx.pid
netstat -antulp | grep nginx
#nginx を停止
kill -3 5964
netstat -antulp|grep nginx
#この時点では、プロセス番号が見つかりません
6. Nginx システム サービスを追加する
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#赋予权限并启动服务
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
#再次查看80端口
lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 6032 root 6u IPv4 35351 0t0 TCP *:http (LISTEN)
nginx 6033 nginx 6u IPv4 35351 0t0 TCP *:http (LISTEN)
nginx -v #查看nginx版本信息
nginx version: nginx/1.22.0
7.Nginx 設定ファイル
Nginxのメイン構成ファイル
グローバル ブロック: nginx にグローバルに影響するディレクティブを構成します。一般に、nginx サーバーを実行しているユーザー グループ、nginx プロセス pid ストレージ パス、ログ ストレージ パス、構成ファイルのインポート、および生成できるワーカー プロセスの数があります。
events block : nginx サーバーまたはユーザーへのネットワーク接続に影響を与える構成。プロセスごとに接続の最大数、接続要求を処理するために選択するイベント ドリブン モデル、複数のネットワーク接続を同時に受け入れることを許可するかどうか、および複数のネットワーク接続のシリアル化を有効にするかどうかが決まります。
http ブロック: 複数のサーバーをネストでき、プロキシ、キャッシュ、ログ定義、サードパーティ モジュール構成などのほとんどの機能を構成できます。ファイルのインポート、MIME タイプの定義、ログのカスタマイズ、sendfile を使用してファイルを転送するかどうか、接続タイムアウト、単一接続要求の数など。
サーバー ブロック: 仮想ホストの関連パラメーターを構成します。1 つの http に複数のサーバーが存在する可能性があります。
location ブロック: リクエストのルーティングと、さまざまなページの処理を構成します。
vim /usr/local/nginx/conf/nginx.conf #nginx.conf是主配置文件
nginx.confの詳細説明
worker_processes 1;
#全局配置本机可运行多少个master进程,根据本机cpu数量设置数量,可设置为auto按cpu核数自动化调整
events {
#events事件处理模块
worker_connections 1024;
#每个worker子进程可以处理多少个请求即可以打开多少个文件
}
http {
#http模块,web服务器与网页有关配置写在此模块中
include mime.types;
#mime.type中规定了那些文件是给用户查看的,若文件类型不在此文件中则是下载文件。
default_type application/octet-stream;
#默认支持文件类型
sendfile on;
#开启文件传输
keepalive_timeout 65;
#长连接超时时间,单位为秒
server {
#http模块中的server模块,主要配置监听端口,虚拟主机,dns域名等
listen 80;
#监听所有ip的80端口
server_name localhost;
#主机名为本机,可虚拟域名
location / {
#http模块下的location模块
root html;
#此location的根目录位置
index index.html index.htm;
#配置默认寻找文件,先寻找index.html若无此文件则找index.htm
}
error_page 500 502 503 504 /50x.html;
#500、502等错误界面跳转访问指定的/下的50x.html页面
location = /50x.html {
#定义此location为精确匹配,必须是50x.html才能访问此页面
root html;
}
}
}
[root@localhost conf]# mkdir -p /var/www/{abc,123}
[root@localhost conf]# cd /var/www/
[root@localhost www]# ls
123 abc
[root@localhost www]# echo 'this is 123 test web!' > 123/index.html
[root@localhost www]# echo 'this is abc test web!' > abc/index.html
vim /usr/local/nginx/conf/nginx.conf
#增加location模块
location /abc {
root /var/www;
index index.html;
}
location /123 {
root /var/www;
index index.html;
}
systemctl reload nginx #改完重新读取 nginx.conf 主配置
8.ブラウザテストを開く
4.アクセス状況統計設定
nginx.conf 構成ファイルを変更し、アクセス場所を指定して stub_status 構成を追加します
#先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的Nginx是否包含HTTP_STUB_STATUS模块
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
cat /opt/nginx-1.22.0/auto/options | grep YES #可查看 nginx 已安装的所有模块
vim /usr/local/nginx/conf/nginx.conf
#添加STUB_STATUS模块
location /state { #访问位置为/status
stub_status on; #打开状态统计功能
access_log off; #关闭此位置的日志记录
}
同時実行数を監視するスクリプトを作成する
#!/bin/bash
while true
do
count=$(curl -Ls 192.168.154.10/state | grep 'Active connections' | awk '{print $3}')
if [ $count -ge 1 ];then
echo '警告当前并发负载过高,并发数为:$count '
fi
sleep 2 #每两秒警告一次
done
5. 認可ベースのアクセス制御
[root@localhost ~]# yum install -y httpd-tools
#生成用户密码认证文件
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db zhangsan
New password: #密码123456
Re-type new password: #确认密码123456
Adding password for user zhangsan
[root@localhost ~]# cd /usr/local/nginx/
[root@localhost nginx]# cat passwd.db
[root@localhost nginx]# htpasswd ./passwd.db lisi
[root@localhost nginx]# cat passwd.db
[root@localhost nginx]# pwd
#降低权限
[root@localhost nginx]# chown nginx passwd.db
[root@localhost nginx]# chmod 400 passwd.db
vim /usr/local/nginx/conf/nginx.conf #更改配置文件
location /abc {
root /var/www;
index index.html;
auth_basic "Hello sir";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
[root@localhost nginx]# nginx -t #检查语法格式
[root@localhost nginx]# systemctl restart nginx
6. クライアントベースのアクセス制御
アクセス制御ルールは次のとおりです。
IP/IP セグメントの拒否: 特定の IP または IP セグメントのクライアント アクセスを拒否します。
IP/IP セグメントを許可: 特定の IP または IP セグメントのクライアントにアクセスを許可します。
ルールは上から下に実行され、一致すると停止し、一致しない場合は停止します。
vim /usr/local/nginx/conf/nginx.conf
location /state {
stub_status on;
access_log off;
allow 127.0.0.1; #允许本机访问
allow 192.168.154.11; #允许192.168.154.11的主机访问
deny all; #禁止其它主机访问
}
systemctl restart nginx
IP アドレスが 192.168.154.11 の仮想マシンを使用したテストは成功しました。
IP アドレス 192.168.154.12 の仮想マシンを使用したテストが失敗し、403 がブラックリストに追加されました
7.ドメイン名に基づくNginx仮想ホスト
Web ホスティング用の Web ドキュメントの準備
Nginxの設定ファイルを修正
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.accp.com;
charset utf-8;
access_log logs/accp.com-access.log;
location / {
root /var/www/abc;
index index.html index.htm;
}
:35,55 co 80 # コピーして修正後、末尾に中括弧を追加
Windowsでテスト済み
Linux システムでテスト済み
8. IP アドレスに基づく Nginx 仮想ホスト
vim /usr/local/nginx/conf/nginx.conf #修改配置文件
9 つのポートベースの Nginx 仮想ホスト
vim /usr/local/nginx/conf/nginx.conf #修改配置文件
SSH ログ検査 (セキュア)
cd /var/log/
vim secure #ssh的连接信息
同じ IP アドレスを持つ見知らぬホストがマシンに何度もアクセスしようとしている場合は、マシンが爆発する可能性があることを意味します。
問題を解決します。スクリプトを作成します。おかしな IP がマシンへのアクセスに何度も失敗すると、ブラックリストに追加され、マシンへのアクセスが禁止されます。