Nginxインタビューのよくある質問





1. Nginxとは何ですか?その利点は何ですか?

Nginxは、HTTP、HTTPS、SMTP、POP3、およびIMAPプロトコル用のWebサーバーおよびリバースプロキシサーバーです。

主な機能は次のとおりです。

1.フォワードプロキシとリバースプロキシ
2.負荷分散、オフロード
3.仮想ホスト(バインディングホスト)

利点:

クロスプラットフォーム、シンプルな構成、ノンブロッキング、高同時接続、低メモリ消費、低コスト。


2.フォワードプロキシとリバースプロキシの違いは何ですか?

ここに画像の説明を挿入
フォワードプロキシ

フォワードプロキシは、クライアントとオリジンサーバーの間にあるサーバーです。オリジンサーバーからコンテンツを取得するために、クライアントはプロキシにリクエストを送信してオリジンサーバーを指定し、プロキシはリクエストをオリジンサーバーに転送します。取得したコンテンツをクライアント側に返します。プロキシサーバーとクライアントは同じLANにあります。


たとえば、fanqiangソフトウェア。Googleにアクセスしたいと思っていたので、プロキシサーバーに転送するように指示しました。

リバースプロキシ

リバースプロキシの実際の動作は、プロキシサーバーがネットワーク上の接続要求を受け入れることです。内部ネットワーク上のサーバーに要求を転送し、サーバーからネットワーク上の接続を要求しているクライアントに結果を返します。プロキシサーバーと元のサーバーは同じローカルエリアネットワーク内にあります。


たとえば、淘宝網に行きたい場合、写真、json、cssが同じサーバーから返されるかどうかはわかりませんが、気にしないでください。リバースプロキシ処理であり、元の処理はわかりません。サーバ。


3. NginxはHTTPリクエストをどのように処理しますか?

マルチプロセスメカニズム(シングルスレッド)と非同期のノンブロッキング方式を組み合わせています。

1.マルチプロセスメカニズム(シングルスレッド)

サーバーがクライアントを受信するたびに、サーバーマスタープロセス(マスタープロセス)は子プロセス(ワーカープロセス)を生成して、クライアントとの接続を確立し、接続が切断されるまで子プロセスを終了します。

2.非同期の非ブロッキングメカニズム

各ワーカープロセスは、複数のクライアント要求を処理できる非同期非ブロッキングモードを使用します。epollモデルが使用され、キューが提供され、キューが解決されます。


ワーカープロセスは、クライアントの要求を受信すると、処理のためにIOを呼び出します。結果をすぐに取得できない場合は、他の要求を処理し(つまり、非ブロッキング)、クライアントはこの期間中に応答を待つ必要がありません。 、および他のものを処理できます(つまり、非同期)。


IOが戻ると、ワーカープロセスに通知されます。プロセスに通知され、現在のトランザクションを一時的に中断して、クライアントの要求に応答します。

なんでこんなに速いの?Nginxの公式紹介を参照できます:http//www.aosabook.org/en/nginx.html


4. Nginxのマスターとワーカーはどのように機能しますか?

これは、Nginxのマルチプロセスおよびシングルスレッドに関連しています。(プロセスにはメインスレッドが1つだけあります)。

なぜシングルスレッドを使用するのですか?

シングルスレッドは、リクエストを非同期で非ブロッキング(管理者はNginxメインプロセスのワーカープロセスの数を構成できます)に使用され、リクエストごとにCPUとメモリリソースを割り当てずに、多くのリソースを節約し、多くのCPUコンテキストを削減しますNginxがより高い同時実行性をサポートするように切り替えます。

簡単なプロセス:

メインプログラムのマスタープロセスが開始されると、forループを介して外部信号を受信して​​処理します。


メインプロセスは、fork()関数を介してワーカーサブプロセスを生成し、各サブプロセスはforループを実行して、イベントの受信と処理を実現します。 Nginxサーバー。

詳細なプロセス:

1. Nginxが開始された後、マスタープロセスと複数の独立したワーカープロセスがあります。


2.マスターは外部からシグナルを受信し、最初にリッスンが必要なソケット(listenfd)を確立し、次に複数のワーカープロセスをフォークアウトしてから、各ワーカープロセスにシグナルを送信します。各プロセスが接続を処理できます。


3.新しい接続が到着すると、すべてのワーカープロセスのlistenfdが読み取り可能になります。1つのプロセスのみが接続を処理するようにするために、すべてのワーカープロセスはlistenfd読み取りイベントを登録する前にaccept_mutexをプリエンプトし、ミューテックスロックを取得するプロセスはlistenfd読み取りイベントを登録します。 、readイベントでacceptを呼び出して、接続を受け入れます。


4.ワーカープロセスが接続を受け入れると、要求の読み取り、要求の解析、要求の処理、データの生成を開始し、クライアントに返し、最後に切断します。


5. Nginxで一般的に使用されるコマンドは何ですか?

启动             nginx
停止             nginx -s stop 或 nginx -s quit
重启             nginx -s reload 或 service nginx reload
重载指定配置文件  .nginx -c /usr/local/nginx/conf/nginx.conf
查看 nginx 版本  nginx -v

6. nginxの500、502、503、504の違いは何ですか?

500:

内部サーバーエラースクリプトエラー、プログラミング言語構文エラーなどの内部サービスエラー。

502:

不正なゲートウェイエラー、不正なゲートウェイ。たとえば、サーバーの現在の接続数が多すぎる、応答が遅すぎる、ページマテリアルが多すぎる、帯域幅が遅いなどです。

503:

サービスが一時的に利用できない、サービスが利用できない、WebサーバーがHTTPリクエストを処理できない、一時的に過負荷になっている、またはサーバーがメンテナンスのためにダウンしている可能性があります。

504:

ゲートウェイタイムアウトゲートウェイタイムアウト。プログラムの実行時間が長すぎて応答タイムアウトが発生しません。たとえば、プログラムを20秒間実行する必要があり、nginxの最大応答待機時間は10秒であるため、タイムアウトが発生します。


7. Nginx圧縮と、圧縮を有効にする方法を理解していますか?

nginx gzip圧縮を有効にすると、画像、css、jsなどの静的リソースのサイズが縮小され、帯域幅を節約して伝送効率を向上させることができますが、CPUリソースを消費します。

gzip on;  
#开启gzip压缩功能
gzip_min_length 1k;
#设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1k。如果小于1k可能会越压越大。
gzip_buffers 4 16k;
#压缩缓冲区大小。表示申请4个单位为16k的内容作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.0;
#压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,使用默认即可。
gzip_comp_level 2;
#压缩比率。用来指定gzip压缩比,1压缩比量小,处理速度快;9压缩比量大,传输速度快,但处理最慢,也必将消耗cpu资源。
gzip_types text/plain application/x-javascript text/css application/xml;
#用来指定压缩的类型,“text/html”类型总是会被压缩。
gzip_vary on;
#vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用squid缓存经过nginx压缩的数据。

注:圧縮が必要なオブジェクトと圧縮する必要のないオブジェクト
(1)1kより大きいプレーンテキストファイルhtml、js、css、xml、html。
(2)画像、ビデオなどを圧縮しないでください削減されませんが、圧縮CPUおよびメモリリソース中に消費されます。


8.NginxとApacheおよびTomcatの違い

TomcatとNginx / Apacheの違い:

1. Nginx / ApacheはWebサーバーであり、ApacheTomactはサーブレットコンテナです。

2. Tomcatはjspを解析でき、nginxとapacheは単なるWebサーバーであり、html静的ファイルサービスのみを提供するものとして簡単に理解できます。

NginxとApacheの違い:

1)Nginxは軽量であり、Webサービスとしても機能し、Apacheよりも少ないメモリとリソースを使用します。

2)Nginxは同時実行性ではなく、Apacheがブロックしている間、nginxはリクエストを非同期で非ブロックで処理します。同時実行性が高い場合、nginxは低リソース、低消費、高パフォーマンスを維持できます。

3)Nginxは、リバースプロキシおよびフロントエンドサーバーとして使用できる負荷分散を提供します

4)Nginxマルチプロセスシングルスレッド、非同期非ブロッキング、Apacheマルチプロセス同期、ブロッキング。


9.Nginxにはどのような負荷分散戦略がありますか

Nginxがデフォルトで提供する負荷分散戦略:

1.ポーリング(デフォルト)round_robin

各リクエストは、異なるバックエンドサーバーに時系列で1つずつ割り当てられます。バックエンドサーバーがダウンしている場合は、自動的に削除できます。

2.IPハッシュip_hash

各リクエストはアクセスIPのハッシュ結果に従って割り当てられるため、各訪問者はバックエンドサーバーへの固定アクセスを持ち、セッション共有の問題を解決できます。
もちろん、実際のシナリオでは、通常、セッション共有を解決するためにip_hashを使用することを検討しないでください。

3.少なくともleast_connを接続します

次のリクエストは、アクティブな接続の数が最も少ないサーバーにディスパッチされます

4.重量

重みの値が大きいほど、割り当てられるアクセス確率が高くなります。これは主に、各バックエンドサーバーのパフォーマンスが不均一な場合に適切なリソース使用率を達成するために使用されます。他の戦略もプラグインを介してサポートできます。


10. Nginxは動的リソースと静的リソースの分離を行いましたか?なぜそれを行いたいのですか?

動的リソースと静的リソースの分離は、動的Webサイトの動的Webページが、特定のルールに従って一定のリソースと絶えず変化するリソースを区別できるようにすることです。

たとえば、js、css、hrmlはAサーバーから返されます。画像はBサーバーから返され、その他の要求はTomcatサーバーCから返されます。

バックグラウンドアプリケーションは、静的コードにアクセスするユーザーの速度を向上させるために個別にデプロイされます。そして今、CDNサービスがあり、サーバーの帯域幅を制限する必要はありません。


11. ngx_http_upstream_moduleモジュールを理解していますか?

ngx_http_upstream_moduleモジュールは、複数のサーバーをサーバーグループに定義するために使用されます。サーバーグループは、fastcgi配信、プロキシ配信、uwsgi配信、memcached配信、およびscgi配信命令で参照できます。

たとえば、www.a.comキャッシュ+スケジューリングにアクセスします。

http{
    
    
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g; # 缓存
    upstream mysqlsrvs{
    
    
        ip_hash;                        # 源地址hash调度方法 写了backup就不可用
        server 172.18.99.1:80 weight=2; # weight权重
        server 172.18.99.2:80;          # 标记down,配合ip_hash使用,实现灰度发布
        server 172.18.99.3:80 backup;   # backup将服务器标记为“备用”,即所有服务器均不可用时才启用 
    }
}
server{
    
    
    server_name www.a.com;
    proxy_cache proxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    location / {
    
    
        proxy_pass http://mysqlsrvs;
    }
}

12.現在の制限と、現在の制限をどのように理解していますか?

Nginxには2つの電流制限方法があります。1つはレートを制御する方法で、もう1つは同時接続の数を制御する方法です。

1.管理率

参考記事

ngx_http_limit_req_moduleモジュールは、リーキーバケットアルゴリズムを提供します。これにより、単一のIPリクエストの処理頻度を制限できます。

1.1通常の電流制限:

基于客户端192.168.1.1进行限流,
定义了一个大小为10M,名称为myLimit的内存区,用于存储IP地址访问信息。
rate设置IP访问频率,rate=5r/s表示每秒只能处理每个IP地址的5个请求。
http {
    
    
	limit_req_zone 192.168.1.1 zone=myLimit:10m rate=5r/s;
}

server {
    
    
	location / {
    
    
		limit_req zone=myLimit;
		rewrite / http://www.hac.cn permanent;
	}
}

パラメータの説明:

limit_req_zone:制限する必要のあるオブジェクトを定義します。
zone:アクセス情報を格納するための共有メモリゾーンを定義します。
rate:最大アクセスレートを設定するために使用されます。

Nginxの現在の制限はミリ秒の単位に基づいています。つまり、1秒間に5つのリクエストを処理すると、200ミリ秒ごとに1つのリクエストのみが処理されます。1つのリクエストが200ミリ秒以内に処理されたが、新しいリクエストが到着した場合、Nginxはリクエストの処理を拒否します。

1.2バーストトラフィックはアクセス頻度を制限します

上記のレートは5r / sに設定されています。トラフィックが急に大きくなることがある場合、制限を超えるリクエストは拒否され、503が返されます。突然のトラフィックはビジネスに影響を与えます。このとき、バーストパラメータを追加することができ、通常はノードレイと組み合わせて使用​​されます。

server {
    
    
	location / {
    
    
		limit_req zone=myLimit burst=20 nodelay;
		rewrite / http://www.hac.cn permanent;
	}
}

burst = 20 nodelayは、これらの20の要求がすぐに処理され、遅延できないことを意味します。これは、特別な作業と同等です。ただし、これらの20の突然の要求がすぐに処理されても、後続の要求はすぐには処理されません。

Burst = 20は、キャッシュキューの20ピットに相当します。要求が処理された場合でも、これらの20の位置は100ミリ秒でしか解放できません。


2、制御同時接続の
参照記事
参照記事2

ngx_http_limit_conn_moduleは、接続数を制限する機能を提供します。

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m; 

server {
    
      
    listen       80;
    server_name  localhost;
    charset utf-8;
    location / {
    
    
        limit_conn perip 10;      # 单个客户端ip与服务器的连接数.
        limit_conn perserver 100; #限制与服务器的总连接数
        root   html;
        index  index.html index.htm;
    }
}

limit_conn perip10のキーは$ binary_remote_addrです。これは、1つのIPが同時に最大10の接続を保持できることを意味します。
limit_conn perserver100のキーは$ server_nameです。これは、仮想ホスト(サーバー)が同時に処理できる同時接続の総数を表します。

おすすめ

転載: blog.csdn.net/QiuHaoqian/article/details/112257367