nginx(エンジン x) は、c10k 問題を解決するために開発された高性能 http サーバーおよびリバース プロキシ サーバーです。
nginx のアーキテクチャは、多くの最新のオペレーティング システム機能を利用して、高性能 http サーバーを実装します。たとえば、Linux システムでは、nginx は epoll、sendfile、file aio、directio およびその他のメカニズムを使用するため、nginx は効率が高いだけでなく、リソース使用量も非常に低くなります。当局は、nginx は 10,000 の非アクティブな http を維持するのに 2.5 しか必要としないと主張しています。キープアライブ接続、メモリ。
nginx は、必要に応じて複数のプロセスを同時に実行します: マスター プロセス (マスター) と複数のワーカー プロセス (ワーカー)。キャッシュが構成されている場合、キャッシュ ローダー プロセス (キャッシュローダー)やキャッシュマネージャープロセス(キャッシュマネージャー)など。すべてのプロセスにはスレッドが 1 つだけ含まれており、プロセス間通信は主に「共有メモリ」メカニズムを通じて実現されます。メインプロセスは root ユーザーとして実行されますが、ワーカー、キャッシュローダー、およびキャッシュマネージャーはすべて非特権ユーザーとして実行する必要があります。
1. nginx のインストール
centos6 版の epel ソースには、nginx の rpm パッケージが追加されていますが、この rpm パッケージのバージョンは下位です。バージョンを更新する必要がある場合は、公式に作成された rpm パッケージを使用するか、ソース コード パッケージを使用してコンパイルおよびインストールできます。
二次開発機能が強化された一部の nginx バージョンを使用することもできます (たとえば、淘宝網の tengine や openresty など)。
1.1 共通のコンパイル パラメータ
--prefix=path: nginx インストール ディレクトリを指定します。
--conf-path=path: nginx.conf 構成を指定します。ファイルパス
--user=name: nginx ワーカープロセスのユーザー
--with-pcre: pcre 正規表現サポートを有効にする
--with-http_ssl_module: SSL サポートを有効にする
--with -http_stub_status_module : nginx のステータスを監視するために使用されます
--with-http-realip_module: クライアント要求ヘッダーのクライアント IP アドレスの変更を許可します
--with-file-aio: ファイル aio を有効にします
-- add -module=path: サードパーティの外部モジュールを追加します。
完全なコンパイル ソリューションはここで提供されます:
--prefix=/usr/local/nginx \
--conf-path=/ etc /nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.ログ \
--http-client-body-temp-path=/var/tmp/nginx/client_body \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--pid-path = /var/run/nginx.pid \
--lock-path=/var/lock/nginx \
--user=nginx \
--group=nginx \
--with - file-aio \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre
1.2 nginx の起動とシャットダウン
nginx の起動:
# nginx -c /etc/nginx/nginx.conf
nginx
# nginx -s stop
#設定ファイルを再読します
# nginx -s reload # pkill -hup nginx
ログ ファイルを再度開きます
# nginx -s reopen # pkill -usr1 nginx
nginx rpm で /etc/init.d/nginx ファイルをダウンロードすることもできますパッケージ化してパスを変更します:
# service nginx {start|stop|status|restart|reload|configtest|}
2 の後に使用できます。nginx.conf 設定ファイル
2.1 一般設定
user nginxnginx workre プロセスを実行するユーザーとグループを指定します
#すべてのワーカーを指定しますプロセス オープンできるファイルの最大数
CPU 間の切り替えによるパフォーマンスの消費を回避するために、ワーカー プロセスの CPU スティッキーを設定します。たとえば、worker_cpu_affinity 0001 0010 0100 1000; (クアッドコア)
ワーカー プロセスの数。この値は CPU の数と同じに設定できます。ssl と gzip がこの値
単一のワーカー プロセスが受け入れることができる同時接続の最大数は、イベント セグメント
エラー ログのストレージ パスとレコード レベル
epoll イベント モデルを使用し、イベント セグメントに配置します
2.2 http server
server {}:仮想ホストを定義します
リスニング アドレスとポートを定義します。デフォルトでは、リスニングは次のすべてのアドレスで行われます。 this machine
仮想ホスト名を定義します。複数の名前を使用でき、正規表現やワイルドカードも使用できます。
sendfile 呼び出しを有効にしてクライアントに迅速に応答します
長い接続タイムアウト、単位は秒です。
クライアントに応答するためのタイムアウト期間を指定します
クライアントによって要求できるエンティティの最大サイズ
リクエストの URL を設定します。対応するリソースが配置されているファイル システム上のルート ディレクトリです。
location [ = | ~ | ~* | ^~ ] uri { ... }
设置一个 uri 匹配路径
=:精确匹配
~:正则表达式匹配,区分字符大小写
~*:正则表达式匹配,不区分字符大小写
^~:uri 的前半部分匹配,且不实用正则表达式
优先级:
= > location 完整路径 > ^~ > ~ > ~* > location 起始路径 > location /
allow 和 deny
基于 ip 访问控制,如:
仅允许 192.168.0.0/24 网段客户端访问
allow 192.168.0.0/24;
deny all;
stub_status on
开启状态显式,仅能用于 location 中:
开启状态显式页面
location /status { stub_status on; allow 172.16.0.0/16; deny all; }
rewrite
url 重写,可以使用多种标记
例如:
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
可用的 flag:
- last:重写完成后,继续匹配其他 rewrite 规则
- break:重写完成后不再继续匹配
- redirect:返回 302 重定向(临时重定向),客户端对重定向的 url 发起新的请求
- permanent:返回 301 重定向(永久重定向),客户端对重定向的 url 发起新的请求
一个 server 配置示例:
server { listen 80; server_name www.example.com; root /web/htdocs; location / { index index.html index.htm; } location /status { stub_status on; allow 10.0.0.0/8; deny all; access_log off; }
2.3 ssl 的配置
启用一个 ssl 虚拟主机
server { listen 443; server_name example.com; root /apps/www; index index.html index.htm; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; # ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2; # ssl_ciphers all:!adh:!export56:rc4+rsa:+high:+medium:+low:+sslv2:+exp; # ssl_prefer_server_ciphers on; }
其中 ssl_certificate 表示 ca 文件,ssl_certificate_key 表示密钥文件。
如果想把 http 请求强制转到 https,可以这样:
server { listen 80; server_name example.me; return 301 https://$server_name$request_uri; }
2.4 nginx 做负载均衡反向代理
nginx 做反向代理时,后端主机有多台,可以使用 upstream 定义一个后端主机池,在反向代理时直接使用主机池的名字。在 upstream 中可以定义负载均衡调度算法,权重,健康状态检测等参数。
例如:
upstream backend { server 172.16.0.1:80 weight=1 max-fails=3 fail_timeout=10; server 172.16.0.2:80 weight=1max-fails=3 fail_timeout=10;; }
默认请求下,使用 round-robin 调度算法,并有健康状态检查和恢复主机的能力。
ningx 还可以使用这些算法:
ip_hash:基于源地址哈希,主要目的是会话保持
least_conn:基于最少活动连接进行调度
sticky:基于 cookie 进行会话绑定,nginx 会在客户端第一次访问时插入路由信息到 cookie 中,或者选择 cookie 中的某个字段的值作为键,以后每次请求将基于此信息进行调度
基于 cookie 的会话绑定共有 cookie,route 和 learn 三种。
例如,基于 cookie name 的调度:
upstream backend { server backend1.example.com; server backend2.example.com; sticky cookie srv_id expires=1h domain=.example.com path=/; }
使用此主机组进行反向代理:
location / { proxy_pass http://backend; proxy_set_header host $host; proxy_set_haeder x-forwared-for $proxy_add_x_forwarded_for; }
proxy_pass url 指定代理的后端主机,可以指定 "http" 或 "https" 协议,域名可以是 ip 地址,也可以是 upstream 池名字
如果代理指定的是一个 uri 地址,如 http://127.0.0.1/remote,那么将直接被代理至指定 uri,无论请求的 uri 是什么
如果代理指定的一个主机而没有 uri,如 http://127.0.0.1,客户端请求的uri将被传递至指定域名
如果 location 中使用模式匹配 url,那么 url 也会被传递至代理 url 的末端
如果 location 中使用了 uri 重写,那么 proxy_pass 会使用重写后的结果进行处理
proxy_set_header header value 对转发的报文首部进行修改
2.5 反向代理时的缓存相关设定
proxy_cache_path path [levels=levels] keys_zone=name:size
定义磁盘缓存路径,nignx 的缓存是以键值方式存放的,keys_zone 用于指定键存放的内存空间名字和大小,对应的值则存放在 path 指定的路径中。levels 可以指定缓存存放路径的级数和名称字符数。此设置只能在 http 段中定义。
如:
proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=one:10m;
proxy_cache_valid [code ...] time 指定不同响应码的内容的缓存时间
如:
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m;
proxy_cache_method method 定义哪些方法的请求结果可以被缓存,如:
proxy_cache_method get; proxy_cache_method head;
proxy_cache name 指定使用预先定义的缓存空间用于缓存
2.6 fastcgi 代理的设置
使用 fastcgi 时,设置代理的方法同 porxy_pass 类似,同时还可以使用 fastcgi 缓存,设置的方法也和 proxy_cache 类似。
location ~ \.php$ { root /web/htdocs; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param script_filename $document_root$fastcgi_script_name; include fastcgi_params; }
3. 一些常用内置变量
$arg_name: リクエスト uri の name パラメータを
$args: リクエスト uri のすべてのパラメータ、$query_string と同じ
$uri: 現在のリクエスト uri (パラメータなし)
$request_uri : 完全なパラメータを含むリクエスト URI
$host: http リクエスト メッセージのホスト ヘッダーホスト ヘッダーがない場合は、このリクエストを処理する仮想ホストのホスト名に置き換えられます。 : nginx サービスが実行されているホスト Name
$remote_addr: クライアント ip
$remote_port: クライアント ポート
$remote_user: ユーザー認証を使用するときにクライアント ユーザーが入力したユーザー名
$request_filename:ユーザーリクエストのuriはローカルルート、またはエイリアス変換後にマップされたローカルファイルパスを通過します
$request_method:リクエストメソッド
$server_addr:サーバーアドレス
$server_name:サーバー名
$server_port:サーバーport
$server_protocol: サーバー宛先 クライアントが応答を送信するときのプロトコル (http/1.1、http/1.0
$scheme など): リクエストで使用されるスキーム (https の https
$http_name など) ://www.magedu.com/: 一致 リクエスト メッセージ内の指定されたヘッダー ($http_host など) は、リクエスト メッセージ内のホスト ヘッダーと一致します
$sent_http_name: 応答メッセージ内の指定されたヘッダー ($sent_content_type など) と一致します応答メッセージの content-type ヘッダーと一致します
$status: 応答ステータス
以上がNginxサーバーのセットアップと基本構成例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。