nginxのの簡単な理解
1. nginxのは何ですか
nginxのは、主にオンライン情報閲覧サービスを提供するために使用される高性能なWebサーバーソフトウェアで、サイトのデザインのための並行性の高いシナリオは、Linuxでは、MacOSの、およびWindowsオペレーティング・システム上で展開することができ、その利点は、高いパフォーマンスを備え、優れた安定性、モジュラー構造、シンプルな構成とリソースの消費量が非常に低いです。HTTPSアクセス、gzip圧縮を、持っているURL書き換えのWebホスティングおよび他の機能は、だけではなく、また、プロキシ、負荷分散とキャッシングサービスや他の機能をリバースプロキシのために使用することができるのFastCGIプログラムで動的なリクエストを処理することができます。
2. nginxの主な機能
2.1リバースプロキシと負荷分散
フォワードプロキシ
クライアントと宛先サーバとの間に位置するプロキシサーバは、クライアントが要求およびプロキシサーバに送信指定されたターゲットサーバは、プロキシ・サーバは、ターゲット・サーバに要求を送信送信し、クライアントに応答して得られた結果を返します。
リバースプロキシ
クライアントのリバースプロキシは、ターゲットサーバであり、クライアントが要求リバースプロキシサーバに送信するために、リバースプロキシサーバーは、内部ネットワーク上のバックエンドサーバーに要求を転送し、その結果に応じて、バックエンドサーバ復帰から得られましたクライアントへ。
ロードバランシング
ロード・バランシングは、負荷がそれによってサービスの可用性と応答速度、より良いユーザ体験を増加、操作複数の実行ユニットに広がるされ、リバースプロキシに基づいて達成されます。
典型的な負荷分散装置4、それぞれポーリング、重量、ip_hash方法およびサードパーティのモジュールを使用して、現在あります。
コンフィギュレーション 説明 ポーリング ロードバランシングのデフォルトの配置サーバーがダウンしている場合、個別に時間順に処理するために別のバックエンドサーバーに割り当てられた各要求は、自動的に拒否されます。 重量道 右の重量比は、ケース凹凸バックエンドサーバーのパフォーマンスのために比例する特定の重量ポーリングアクセス速度を使用します。 ip_hash方法 各訪問者は、固定のバックエンドサーバがセッション共有の問題を解決することができるアクセスできるように、各要求は、ハッシュ結果アクセスIPによって割り当てられます。 サードパーティ製のモジュール サードパーティを使用する場合、各サーバ要求割り当て、短い応答時間優先割り当ての応答時間に応じて、フェアモジュール、サードパーティモジュールurl_hashは、割当要求のハッシュ値に基づいてURLにアクセスする場合。 1.ポーリング
ロードバランシングのデフォルトの配置サーバーがダウンしている場合、個別に時間順に処理するために別のバックエンドサーバーに割り当てられた各要求は、自動的に拒否されます。
upstream test1 { server localhost:8080; server localhost:8081; } server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://test1; proxy_set_header Host $host:$server_port; } }
2.重量道
右の重量比は、ケース凹凸バックエンドサーバーのパフォーマンスのために比例する特定の重量ポーリングアクセス速度を使用します。
upstream test2 { server localhost:8080 weight=9; server localhost:8081 weight=1; } server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://test2; proxy_set_header Host $host:$server_port; } }
3.ip_hash方法
各訪問者は、固定のバックエンドサーバがセッション共有の問題を解決することができるアクセスできるように、各要求は、ハッシュ結果アクセスIPによって割り当てられます。
upstream test3 { ip_hash; server localhost:8080; server localhost:8081; } server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://test3; proxy_set_header Host $host:$server_port; } }
4.サードパーティのモジュール
サードパーティを使用する場合、各サーバ要求割り当て、短い応答時間優先割り当ての応答時間に応じて、フェアモジュール、サードパーティモジュールurl_hashは、割当要求のハッシュ値に基づいてURLにアクセスする場合。
upstream test4upstream test4 { fair; server localhost:8080; server localhost:8081; } server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://test4; proxy_set_header Host $host:$server_port; } }
2.2静的および動的分離
nginxのは、静的および動的分離システム全体の性能がより効率的に、静的および動的な要求は、要求に応じて、適切なサーバ・プロセスを要求分離する手段を提供します。
nginxの分離運動の基礎となっている構成に基づいて、異なる要求に対して異なっていてもよく転送されます。要求に対応する静的静的リソースは、バッファnginxの上で直接行うことができる、より良いアプローチは、サーバーの応答にバッファリングすることです。動的な要求は、バックエンドサーバの応答によって処理されます。
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root /usr/local/html/;
index index.html;
}
# 所有静态请求都由 Nginx 处理
location ~ \.(git|jpg|png|css|js)$ {
root /usr/local/html/;
}
location ~ \.(jsp|do)$ {
root /usr/local/html/;
}
error_page 500 502 503 504 /50x/html;
location = /50x.html {
root /usr/local/html/;
}
}
詳しく3. nginxの構成
nginxのは、構成に書き込まれているnginx.conf
ファイル、ブロックに適用nginxの用語の範囲からコンフィギュレーション命令は、即ち、5分割されています。
- グローバル演技ブロック
- イベントScopeブロック
- HTTP命令Scopeブロック
- サーバー命令Scopeブロック
- 位置指示スコープブロック
3.1グローバルスコープブロック
で全局作用域块
構成nginxの一般的な構成、nginxのようなユーザグループ情報、並行プロセスnginxのログ記憶場所の数。
nginxのを開始するための許可を制御するためのnginxの設定ユーザグループ情報;
通常の状況下で、同時サービスが優れているが、逆になり、ハードウェアの許容範囲を超えているので、我々は、典型的には、autoに設定するので、nginxのは、ハードウェアに関する情報を確認プロセスの適切な数を可能にします。
# Nginx 用户及组: 用户 组。 windows 下不指定
user nginx nginx;
# 工作进程:数目。根据硬件调整,通常等于 CPU 数量或者 2 倍与 CPU。
worker_processes 8;
# 错误日志:存放路径
error_log logs/error.log
error_log logs/error.log notice;
error_log logs/error.log info;
# pid (进程标识符):存放路径
pid logs/nginx.pid;
3.2イベントScopeブロック
event 作用域块
設定処理nginxの接続要求、モジュールは、典型的には、イベントの接続プロセスの数を構成され、各ワーカー・プロセスは、同時接続の最大数を扱うことが可能です。
ではserver 指令作用域块
私たちのプロキシ設定スタンドアロンのプロジェクトすることができます。
events {
# 每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合使用,在不使得 CPU 满载(100%)情况下尽可能的大。每个进程允许的最多连接数,理论上每台 Nginx 服务器最大连接数为:worker_processes * worker_connctions
worker_connections 204800;
# 客户端请求头部的缓冲区大小。这个可以根据系统分页大小来设置,一般一个请求头的大小不会超过 1K,不过由于一般系统分页都要大于 1K,所以这里设置为分页大小。
# 分页大小可以用命令 getconf PAGESIZE 取得。假设从命令行得到的分页大小为 4096。
# 当 client_header_buffer_size 超过 4K 的情况,可以将该值设置为 4K 的整数倍数。
client_header_buffer_size 4K;
# 将为文件制定缓存,默认是没有启用,max 制定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没有被请求后删除缓存。
open_file_cache max=65535 inactive=60s;
# 多长时间检查一次缓存的有效信息
open_file_cache_valid 80s;
# 在 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的。如果文件在 inactive 时间内一次都没有被使用过,则将其从缓存中移除。
open_file_cache_min_uses 1;
}
3.3 HTTP命令Scopeブロック
nginxのはさhttp 指令作用域块
nginxのHTTPプロセスを制御するために使用します。
ログのフォーマット:
- REMOTE_ADDRと$ HTTP_X_FORWARDED_FOR:クライアントのIPアドレスを記録し、
- $ REMOTE_USER:クライアントのユーザー名を記録。
- $ Time_local:レコードのアクセス時刻とタイムゾーン。
- $要求:httpプロトコル要求に記録したURL。
- $ステータス:要求の記録状態が成功した200です。
- $ Body_bytes_sent:レコードがクライアント主題のファイルサイズに送信されます。
- $ HTTP_REFERER:リンクページから来た記録へのアクセスを。
- $ HTTP_USER_AGENT:クライアントのブラウザに関する情報を記録。
それは、クライアントのIPアドレスを取得することはできませんので、通常はリバースプロキシサーバーのIPアドレスのIPアドレスを取得REMOTE_ADDR $により、リバースプロキシWebサーバの背後に配置。リバースプロキシサーバーは、要求のHTTPヘッダ情報を転送するには、サーバアドレスの既存のクライアント、元のクライアント要求のIPアドレスを記録するために、x_forwarded_for情報を増やすことができます。
# 设定 http 服务器,利用它的反向代理功能提供负载均衡支持
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$htto_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
# 用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径;
access_log logs/host.access.log main;
access_log logs/host.access.404.log log404;
# 客户端请求头部的缓冲区大小。可以参见 event 作用域块中的说明。
client_header_buffer_size 4k;
# 客户端请求头最大缓冲大小和数量。Nginx 默认会用 client_header_buffer_size 这个 buffer 来读取 header 值,如果 header 过大,则会使用 large_client_header_buffers 来读取。
large_client_header_buffers 8 128k;
# 指定缓存是否启用。
open_file_cache max=102400 inactive=20s;
# 何时需要检查 open_file_cache 中缓存项目的有效信息
open_file_cache_valid 30s;
# 在缓存参数 inactive 时间内文件使用的最少次数,若使用次数大于该值,则文件描述符在缓存中处于打开状态。
open_file_cache_min_uses 2;
# 指定是否在搜索一个文件时记录 cache 错误 [open_file_cache_errors on | off]
open_file_cache_errors on;
# 设定通过 Nginx 上传文件的大小
client_max_body_size 300m;
# 指定 Nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on。如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 IO 处理速度,降低系统 uptime。
sendfile on;
# 此选项允许或禁止使用 socket 的 TCP_CORK 的选项,此选项仅在 sendfile 的时候使用
tcp_nopush on;
# 后端服务器连接的超时时间(发起握手等候响应超时时间)
proxy_read_timeout 180;
# 后端服务器数据回传时间(在规定时间之内后端服务器必须传完所有的数据)
proxy_send_timeout 180;
# 设置从被代理服务器读取的第一部分应答的缓冲区大小
proxy_buffer_size 256k;
# 设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小
proxy_buffer 4 256k;
proxy_busy_buffer_size 256k;
# 设置在写入 proxy_temp_path 时数据的大小,预防一个工作进程在传递文件时阻塞太长
proxy_temp_file-write_size 256k;
# proxy_temp_path 和 proxy_cache_path 指定路径必须在同一分区
proxy_temp_path /data0/proxy_temp_dir;
# 设置内存缓存空间大小为 200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为 30GB
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
# 客户端请求服务器的最大允许大小
client_body_buffer_size 512k;
# 表示 Nginx 阻止 HTTP 应答代码为 400 或者更高的应答。
proxy_intercept_errors on;
# 负载均衡
upstream backend {
server server1;
server server2;
}
}
3.4サーバー命令とScopeブロックのスコープブロックの場所ディレクティブ
# 配置虚拟机
server {
# 配置监听端口
listen 80;
# 配置访问域名
server_name image.***.com;
# 对以 mp3/exe 结尾的地址进行负载均衡
location ~* \.(mp3|exe)$ {
# 设置被代理服务器的端口或套接字,以及 URL
proxy_pass http://img_relay$request_uri;
# 将代理服务器收到的用户信息传到真实的服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /face {
if($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://127.0.0.1:8080/face.jpg redirect;
}
# 将代理服务器收到的用户信息传到真实的服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/face.log log404;
rewrite ^(.*)$ http://127.0.0.1:8080/face.jpg redirect;
}
location /image {
if($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://127.0.0.1:8080/face.jpg redirect;
}
proxy_pass http://img_relay$request_uri;
# 将代理服务器收到的用户信息传到真实的服务器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
}
位置マッチングルール説明:
- 〜:大文字と小文字を区別行い、正規のマッチングを示します
- 〜*:小文字を区別しない正規のマッチングを行うことを示し
- ^〜:オプションが一致した場合、試合唯一のオプション、その他のオプションの不一致を通常の文字列マッチングを表します(通常のディレクトリにマッチします)
- @:LOCATIONという名前の、内部方向で使用、例えばerror_page、try_filesを定義します
優先度:完全一致>定期的なマッチング>部分一致>一般的な試合
(location = ) > (location 完整路径) > (location ^~ 路径) > (location ~ | ~* 正则匹配) > (location 部分起始路径) > (location /)
# location =
location = / {
# 精确匹配 /,主机名后面不能带任何字符串
[ configuration A ]
}
# location /
location / {
# 所有地址都是以 / 开头,因此匹配所有请求
[ configuration B ]
}
# location 部分起始路径
location /documents/ {
# 匹配任何以 /documents/ 开头的地址
[ configuration C ]
}
#location ^~ 路径
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址
[ configuration D ]
}
#location ~ 正则匹配
location ~ /documents/Abc {
# 匹配包含 /documents/Abc 的地址(区分大小写)
[ configuration CC ]
}
# location ~* 正则匹配
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求(不区分大小写)
[ configuration E ]
}
location /images/ {
[ configuration F ]
}
location /images/abc {
[ configuration G ]
}
# location ~* 正则匹配
location ~* /js/.*\.js {
# 匹配 /js/[anychars].js (不区分大小写)
[ configuration H ]
}