オリジナル:https://www.cnblogs.com/qdhxhz/p/8910174.html
nginxのは、入門チュートリアル
I.概要
nginxのは何ですか?
nginxの(エンジンx)は 、軽量Webサーバー、リバースプロキシサーバーと電子メール(IMAP / POP3)プロキシサーバーです。
リバースプロキシとは何ですか?
リバースプロキシ(リバースプロキシ)モードでは、インターネット上の接続要求を受け入れるようにプロキシサーバを参照し、内部ネットワーク上のサーバにリクエストを転送し、要求インターネット接続上のクライアントにサーバから得られた結果を返しますこの時点で、リバースプロキシサーバーのパフォーマンス上の外部プロキシサーバ。
第二に、一般的に使用されるコマンド
nginxのは、使用するのは比較的簡単であるいくつかのコマンドです。
高速のnginxのを閉じるnginxの-s停止#は、関連する情報が保存され、すぐにWebサービスを終了することはできません。 nginxの-sは、情報を保存し、nginxの#スムーズな開閉を終了し、Webサービスの終了を予定しています。 nginxの-sリロード#nginxのため、設定の変更には、設定を再ロードし、再ロードする必要があります。 nginxのは、ログファイルを再度開くには、#を再開-s。 nginxのnginxの-cファイル名の#は、デフォルトの代わりに、設定ファイルとして指定されています。 nginxの-t#は実行されませんが、唯一のプロファイルをテストします。nginxのは、設定ファイルの構文の正しさを確認し、を基準プロファイルにファイルを開こうとします。 nginxのnginxの-v#ショーのバージョン。 nginxのnginxの-V#のshow version、コンパイラのバージョンや設定パラメータ。
私は、Linuxでのsbinディレクトリに入力された:./ nginxのnginxの代わりに、上記の
あなたはすべてのコマンドをノックしたくない場合は、スタートは、インストールディレクトリのnginxの中に新しいバッチファイルを追加することができますのstartup.batを実行するためにダブルクリックします。これは次のように読み取ります。
OFF @echo すでに開始nginxの前に開始し、pidファイルを記録した場合#rem、それは指定されたプロセスの強制終了されます nginx.exe -s STOPの #remテストコンフィギュレーション・ファイルの構文の正しさを nginx.exe -t -c confに/ nginx.conf #rem表示バージョン情報 nginx.exe -v nginxの開始する指定された設定に従って#rem nginx.exe -C CONF / nginx.confを
あなたがLinux上で実行している場合は、同じ非常に多く、シェルスクリプトを記述します。
nginxの設定戦闘
あります:httpリバースプロキシの設定、負荷分散の構成、サイトがHTTPSプロキシの設定、静的なサイト構成、クロスドメインソリューションを逆に、複数のWebアプリケーションの構成を有しています
三、HTTPリバースプロキシの設定
ちょうどリバースHTTPプロキシを完了し、設定の複雑さを考慮していない:のは、小さな目標を達成しましょう。
nginx.conf設定ファイルは次のよう
#実行ユーザ 誰か#USER; #は、プロセスを開始し、通常のCPUの数と等しくなるように設定さ worker_processes 1; #グローバルエラーログ のerror_logのD:/Tools/nginx-1.10.1/logs/error.log; のerror_logのD:/ツール/注意notice.log 1.10.1-nginxの/ログ/; error_logにはD:/Tools/nginx-1.10.1/logs/info.log情報; #のPIDファイル、現在のブートnginxのプロセスIDを記録し たPID Dを:/ツール/ 1.10.1-nginxの/ログ/ nginx.pid; # 接続の数と運転モードに制限 イベント{ worker_connections 1024;#単一のバックグラウンド・プロセスワーカープロセス同時リンクの最大数 } のリバースプロキシ機能を使用して、#セットhttpサーバを提供支持ロードバランシング HTTP { #セットMIMEタイプ(メールサポートタイプ)、タイプmime.typesファイルは、定義され ; /Tools/nginx-1.10.1/conf/mime.types:ザはD含む default_typeファイルアプリケーション/オクテットのストリームを、 #を提供します与えられたログ メインLOG_FORMAT '[$ REMOTE_ADDR] - [$のREMOTE_USER] [$ time_local] "$リクエスト"' '$ $ body_bytes_sentステータス"$ HTTP_REFERER"' ' "$ HTTP_USER_AGENT" "$ HTTP_X_FORWARDED_FOR"'; のaccess_logのD:/ツール/ nginx-メイン/ access.logを1.10.1 /ログ; ON rewrite_log; #sendfileディレクティブは一般的なアプリケーションのための出力ファイルにnginxのsendfileのコール機能(ゼロコピーモード)かどうかを指定し、 ディスクなどのアプリケーションをダウンロードするために使用される場合#は、onに設定する必要がありますIO大型アプリケーションは、ディスクおよびネットワークI / O処理速度のバランスをとると、システムの稼働時間を低減するために、オフに設定してもよい。 sendfileのON、 ON #tcp_nopush; #接続時間 120 keepalive_timeout; TCP_NODELAY ON; #gzip圧縮スイッチ #gzipオン; #サーバーのセットの現実的なリスト アップストリームzp_server1 { 127.0.0.1:8089サーバー; } #Httpサーバー サーバー{ #リスニングポート80は、ポート80がHTTPプロトコルのウェルノウンポート番号である ザ80を聴く; #www.xx.com使用してアクセスを定義 SERVER_NAME www.helloworld.comを、 #ホーム インデックスのindex.html #ポイントWebアプリケーションディレクトリ ルートD:\ 01_Workspace \プロジェクト\ GitHubの\ ZP \ SpringNotes \春のセキュリティ\春史郎\ webappの\のsrc \メイン; #エンコーディングフォーマット 。文字セットUTF-8; #プロキシ設定パラメータ proxy_connect_timeout 180 [; proxy_send_timeout 180 [; proxy_read_timeout 180 [ ; proxy_set_header $ホストのホスト; X-フォワーダ-FOR-$ REMOTE_ADDRをproxy_set_header。 パスマップの位置の後方に設けられた(上流と結合した)#リバースプロキシパス、 位置/ { proxy_passのHTTP:// zp_server1; } #静的ファイル、nginxの独自の処理 場所〜^ /(イメージ|ジャバスクリプト | JS | CSS | フラッシュ|メディア|静的)/ { ルートD:\ 01_Workspace \プロジェクト\ GitHubの\ ZP \ SpringNotes \春のセキュリティ\春史郎\ SRC \メインのwebapp \ビュー\; #は30日、以下の静的ファイルの更新、期限切れの期限切れ頻繁な更新は、あなたがより小さく設定することができれば、大きく設定することができます。 30dは有効期限; } #チェックnginxの状態アドレス設定 LOCATION / NginxStatus { stub_status ON; access_logのON; AUTH_BASIC "NginxStatusを"; 会/ htpasswdのをauth_basic_user_file; } #はファイルアクセス.htxxxを禁止します 〜{/\.ht LOCATION ;すべて拒否 } #ページのエラー処理(オプション設定) #error_page 404 /404.html; #error_page 500 502 503 504 /50x.htmlと、 #location = / {50x.html #ルートHTML; #} } }
さて、それを試してみましょう:
- Webアプリケーションを起動し、注意がnginxのとのポートを開始するためにバインドされている
upstream
一貫性のあるポート設定を。 -
ドライバに\ WINDOWS \ System32に\ホストファイル\ etcディレクトリに、DNSレコードを追加:Cで:ホストを変更
127.0.0.1のwww.helloworld.com
- 以前の注文のstartup.batで起動します
-
ブラウザでアクセスwww.helloworld.comは、驚くことではないが、すでに訪問しました。
あなたは、Linuxである場合は、hostsファイル:ETC \ホストを
第四に、ロードバランシングの設定
前の例では、唯一のプロキシサーバを指します。
しかし、操作の実際のサイトでは、すべてのほとんどは、同じアプリケーションを実行している複数のサーバーを持っている、あなたは分割するロードバランシングを使用する必要があります。
nginxのは、単純な負荷分散を実現することができます。
192.168.1.11:80,192.168.1.12:80,192.168.1.13:80 3つのLinuxサーバー環境にデプロイされたアプリケーション:そのようなシナリオを想定しています。ドメインはwww.helloworld.comと呼ばれる、パブリックIPは192.168.1.11です。nginxのは、パブリックIP、ロード・バランシング・プロセスのすべての要求サーバーにデプロイ。
nginx.conf 以下のような構成は以下のとおりです。
{HTTP 位mime.typeによって定義されたMIMEタイプ、ファイルタイプ設定 ザは/etc/nginx/mime.typesを含むが、 default_typeファイルアプリケーション/オクテットのストリームを、 #ログフォーマットセット のaccess_log /var/log/nginx/access.log; #設定負荷分散サーバリストは {上流load_balance_serverの 確率パラメータはより高い重みが大きいに割り当てられ、#weigth重みを示す サーバ192.168.1.11:80量= 5; =重量192.168.1.12:80サーバ1; サーバ192.168 .1.13:重量= 80 6; } #httpサーバ サーバ{ #リスナーポート80 ザ80を聴く; #www.xx.com使用してアクセスを定義 SERVER_NAME www.helloworld.comを、 #負荷分散の要求のすべての要求の 位置/ { ルート/ルート、デフォルトのWebルートディレクトリの場所の#は、サーバの定義 インデックスのindex.htmlのindex.htmを、インデックスファイルの#defineホームの名前 proxy_passはhttp:// load_balance_server;#要求はサーバのload_balance_server定義されたリストを回し #次は、リバースプロキシの一部です設定(オプション設定) #proxy_redirect OFF; proxy_set_header $ホストのホスト; X-実IP- $ REMOTE_ADDRをproxy_set_header; #バックエンドWebサーバーは、実転送さ-X-の場合を介してユーザIPを取得することができます X-転送さ-FOR-$ REMOTE_ADDR proxy_set_header ; proxy_connect_timeout 90、バックエンドサーバ(プロキシ接続タイムアウト)と#nginx接続時間が 90 proxy_send_timeout;#バックエンド・サーバー・データ・リターン時間(タイムアウトを送信する) 90 proxy_read_timeout、接続が成功した後に#を、バックエンドサーバの応答時間(プロキシ受信タイムアウト) 4Kをproxy_buffer_size;#プロキシ設定(nginxの)は、ユーザヘッダ情報のバッファサイズ保存 proxy_buffers 4 32K;バッファ、平均ページ32K以下は、そのような配置#proxy_buffers proxy_busy_buffers_sizeの64Kと、#高負荷バッファサイズ(proxy_buffers * 2) proxy_temp_file_write_sizeの64Kと、上流側から、この値よりも大きい#セットキャッシュフォルダのサイズ、サーバ送信 client_max_body_size 10Mは、#は、クライアントがバイト単一のファイルの最大数を要求することを可能にする client_body_buffer_sizeの128Kと、クライアントバッファ番号によって要求された緩衝剤中の最大バイト数 } } }
V.サイトは、複数の構成のWebアプリケーションを持っています
場合は、ウェブサイトより機能、多くの場合、いくつかの独立した機能モジュールのスピンオフ、独立したメンテナンスが必要です。この場合、通常は、より多くのWebアプリケーションがあるでしょう。
たとえば、次のようにwww.helloworld.comサイトは、いくつかのWebアプリケーション、金融(金融)、製品(製品)、管理者(ユーザーセンター)がある場合。これらのアプリケーションへのアクセスは、コンテキスト(文脈)で区別されています。
www.helloworld.com/finance/
www.helloworld.com/product/
www.helloworld.com/admin/
私たちは、あなたがすべての80個のポートを備えた、単一のサーバ上で同時にこれら三つのwebappアプリケーションを起動する場合は、必ず成功、HTTPのデフォルトのポート番号は80であることを知っています。だから、これらの3つのアプリケーションは、それぞれ別のポート番号をバインドする必要があります。
ユーザが実際にwww.helloworld.comサイトにアクセスしたときので、質問は、別のWebアプリケーションへのアクセスである、あなたはないでしょうもそれにアクセスするためのポート番号を対応します。だから、もう一度、あなたが処理を行うためにリバースプロキシを使用する必要があります。
設定は、それを行う方法を見ることは難しいことではありません。
{HTTP #いくつかの基本的な構成は省略する 上流product_server { ;サーバーwww.helloworld.com:8081 } admin_serverの{上流 サーバーwww.helloworld.com:8082; } 上流finance_server { サーバーwww.helloworld.com:8083; } サーバー{ #いくつかの基本的な構成省略する #デフォルトサーバの積に LOCATION / { proxy_passのHTTP:// product_server; } LOCATION /製品/ { proxy_passのHTTP:// product_server; } LOCATION / ADMIN / { proxy_passのHTTP:// admin_serverの。 } LOCATION /ファイナンス/ { proxy_passます。http:// finance_server。 } } }
六、HTTPSプロキシの設定リバース
サイトのより高いセキュリティ要件のいくつかは、HTTPS(HTTP標準プロトコルセキュリティを使用してSSL通信)を使用することができます。
ここでは科学のHTTPプロトコルとSSL標準ではありません。しかし、HTTPSを使用してnginxの設定はそれを知っている必要があります:
- HTTPS固定ポート番号は、HTTPポート80とは異なり、443であります
- あなたが証明書とそれに対応するキーを指定する必要がnginx.confので、標準のSSLセキュリティ証明書は、導入する必要があります
その他のhttpとリバースプロキシは、基本的には同じですが、中 Server
の構成の一部異なる部分。
#HTTPサーバーの サーバー{ #モニター443ポート。443は、主に、HTTPSプロトコルに使用される周知のポート番号であり 、443 SSLを聴く www.xx.com#定義が使用されるアクセス サーバー名www.helloworld.com; #ssl証明書ファイルの場所(一般的な証明書の形式:CRT / PEM) ssl_certificate CERT。 PEM; #ssl証明書キー位置 ssl_certificate_keyのcert.key; #ssl構成パラメータ(オプション設定) 共有ssl_session_cache:SSL:1M; ; ssl_session_timeout部5m MD5の本明細書中で使用される#デジタル署名 のssl_ciphersがHIGHに:aNULL:MD5を;! ON ssl_prefer_server_ciphers ; LOCATION / { ルート/ルート; インデックスのindex.htmlのindex.htm; } }
七、静的なサイト構成
時には、我々は(静的なHTMLファイルやリソースの束すなわち)静的サイトを構成する必要があります。
たとえば:すべての静的リソースがに置かれている場合 /app/dist
、ディレクトリ、我々は必要な nginx.conf
ホストは、サイトのホーム・ページと同様に指定することができます。
以下のような構成は以下のとおりです。
worker_processes 1; イベント{ worker_connections 1024。 } HTTP { のmime.typesを含みます。 default_type application / octet-streamと; sendfileの上; keepalive_timeout 65; gzipの上; gzip_types text / plainのアプリケーション/ X-ジャバスクリプトテキスト/ CSSのアプリケーション/ XMLテキスト/ javascriptのアプリケーション/ javascriptの画像/ JPEG画像/ GIF画像/ PNG。 ;上のgzip_vary サーバー{ 80を聞きます。 サーバー名のstatic.zp.cn。 位置/ { ルート/アプリ/ DIST。 インデックスのindex.html; #转发任何请求到のindex.html } } }
次に、HOST:
127.0.0.1 static.zp.cn
この場合、ローカルブラウザでアクセスstatic.zp.cnでは、静的なサイトにアクセスすることができます。
八クロスドメインソリューション
Web開発分野、フロントとリアが頻繁に使用するモードを終了し分離しました。このモードでは、フロントとリアの端部は、例えば、それぞれ独立して、Webアプリケーションの次のとおり後端は、Javaプログラムである遠位反応させヴューまたはアプリケーション。
お互いを訪問したときに別のWebアプリは、そこには、クロスドメインの問題にバインドされています。二つの一般的なアイデアがありますクロスドメインの問題を解決します:
- HEARTS
バックエンドサーバーにHTTPレスポンスヘッダを設定するには、ドメイン名が参加するために追加されて実行する必要が Access-Control-Allow-Origin
で。
- JSONP
遠位端クロスドメインJSONPと要求、JSON構成データ、及び戻り、後端。
これら二つのアイデアは、この記事では説明しません。
これは、最初のアイデアによれば、nginxのを指摘するだけでなく、クロスドメインソリューションに対する解決策を提供すべきです。
たとえば:www.helloworld.comサイトは、バックエンド・アプリケーションからなる、フロントエンドアプリケーションによって作成されました。フロントエンド・ポート番号は9000で、ポート番号は8080です。
あなたが使用している場合は、フロントとリアのhttp相互作用のため、要求をクロスドメインの問題を拒否されます。nginxのは、それを解決する方法です、見てみましょう:
まず、イネーブルcors.conf CORSファイルを設定します。
# allow origin list set $ACAO '*'; # set single origin if ($http_origin ~* (www.helloworld.com)$) { set $ACAO $http_origin; } if ($cors = "trueget") { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; } if ($request_method = 'OPTIONS') { set $cors "${cors}options"; } if ($request_method = 'GET') { set $cors "${cors}get"; } if ($request_method = 'POST') { set $cors "${cors}post"; }
接下来,在你的服务器中 include enable-cors.conf
来引入跨域配置:
# ---------------------------------------------------- # 此文件为项目 nginx 配置片段 # 可以直接在 nginx config 中 include(推荐) # 或者 copy 到现有 nginx 中,自行配置 # www.helloworld.com 域名需配合 dns hosts 进行配置 # 其中,api 开启了 cors,需配合本目录下另一份配置文件 # ---------------------------------------------------- upstream front_server{ server www.helloworld.com:9000; } upstream api_server{ server www.helloworld.com:8080; } server { listen 80; server_name www.helloworld.com; location ~ ^/api/ { include enable-cors.conf; proxy_pass http://api_server; rewrite "^/api/(.*)$" /$1 break; } 場所〜^ / { proxy_passます。http:// front_server。 } }
これは、完了です。