記事のディレクトリ
A、nginxの関連問題
1.1 nginxのは、要求それに対処する方法ですか?
(1)nginxの起動時に、それが必要なリスニングポートとIPアドレスを与えるために、構成ファイルを解析し、その後、内部のnginxのマスター・プロセス、初期化された優れたこのモニターソケットは、その後、耳を傾け、その後、複数のうちのサブプロセスアウトフォーク、子供は新しい接続を受け入れ競います。
(2)この場合、クライアントは、nginxのへの接続を開始することができます。nginxの持つクライアントはnginxの良いとの接続を確立するために3ウェイハンドシェイクなる場合には、
(3)この場合、サブプロセスは、パッケージ接続の成功は、nginxの作成、すなわちngx_connection_t構造を受け入れます。次に、そのようなHTTPクライアントモジュールとデータ交換など、イベント処理モジュールの適切なイベントを呼び出します。
(4)最後に、nginxの又はこれに接続されたアクティブクライアントの電源をオフにし、接続が完了する。
1.2 nginxのはなぜマルチスレッドを使用しませんか?なぜこのような高性能?nginxのは、高い並列性を実現する方法ですか?
(1)は、複数のプロセスやスレッドを作成して、そのようなApacheサーバとして動作し、各スレッドやプロセスがCPUとメモリを割り当てますが、総会を超える同時ドレインサーバリソース。仕事のウェブサーバーの性質上、各リクエストの生活の大部分は、ネットワーク伝送である、作品は実際にサーバマシン上で多くの時間を費やして決定されます。これは、いくつかの高い同時実行の秘密を解決するためのプロセスです。それは計算集約的ではないIO集約型アプリケーション、ネットワーク、Webサーバのほんの一部です。
(2)nginxの、単一スレッドの非ブロッキング非同期要求の処理、ファイルディスクリプタモデルの使用は、キューを提供し、キューイング溶液は、それぞれCPUやメモリのためのリソースの割り当てを要求することなく、多くのリソースを節約するように、だけでなくの量を減少させますCPUコンテキストの切り替え。それはnginxのは、高い同時実行をサポートしていますので。
(3)nginxのマスタ・プロセスがマスターを持って、作業者の複数に対応する処理作業マスタは、複数の要求を処理することができ、各ワーカーの作業工程は、各要求に来る、ハンドルにワーカープロセスが存在することになります。しかし全体ではなく、プロセスは、そのような転送のバックエンドサーバの要求として、発生する可能性があり、ブロッキングと復帰への要求を待っているところに、プロセス。したがって、このプロセスの作業員は、他の要求を処理し続け、バックエンドサーバーが返すと、それは、労働者が引き継ぐ、この要求は、その後下がるだろう、このイベントをトリガします。
二、nginxのインストールとチューニングコンパイル
2.1コンパイルとインストール
1、エキス:
1)タールパッケージを抽出します。 タールzxf nginxの-1.15.7.tar.gz
2)隠すnginxのバージョン、および攻撃を防ぎます。vimのnginxの-1.15.7 / SRC /コア/ nginx.h
nginxの-1.15.9ディレクトリの内容
1)auto目录:里面有4个子目录,cc是编译使用的,os是判断操作系统类型的,其他都是辅助configure编译的,也就是操作系统有什么特性供nginx使用
2)CHANGES:各版本的改变,bug修复等信息;CHANGES.ru:nginx作者是俄罗斯人,这是俄罗斯版本
3)conf: 为了方便运维配置,conf目录里有示例文件,安装好后会拷贝到安装目录
4)configure
5)contrib:提供nginx语法检测字体
cp -r contrib/vim/* ~/.vim ##家目录下如果没有.vim目录,手动新建
6)html:默认发布目录,50x.html是报500错误时的页面
7) src:源码目录
ファイルを変更し/nginx-1.15.9/src/core/nginx.h
#define NGINX_VER "nginx/" NGINX_VERSION
改为:
#define NGINX_VER "nginx/"
3)でnginxのソース/オート/ CC / gccのファイル: Vimのオート/ CC / GCC
- このモードデバッグモードでは、通常のコンパイル処理の終了は、数メガバイトのパッケージのサイズが生成されます、のような追跡と主張する多くの情報を挿入します、我々は、唯一の数百を生成しますので、コンパイル終了することを、コンパイルする前にデバッグモードをオフにすることができますパケットサイズK.
# debug
#CFLAGS="$CFLAGS -g" ##本行注释掉,关闭debug日志模式,
2、コンパイルしてnginxのインストール
1)GCCコンパイラとのdevel-OpenSSLのインストール OpenSSLの-develのyumをインストールgccの-Y:
2)を/root/nginx/nginx-1.15.9コンパイラのディレクトリ:
./configure \
###自定义配置:
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
--prefix=PATH
## 指定nginx的安装目录。默认 /usr/local/nginx
--with-http_realip_module
##通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For)
##意义在于能够使得后台服务器记录原始客户端的IP地址
--with-http_ssl_module
##使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
--without-http_rewrite_module
##perl正则表达式使用在location指令和ngx_http_rewrite_module模块中。
検出されたエラー:
理由:依存性の欠如:GD-develの-2.0.35-26.el7.x86_64.rpm(何不足している機器)
3)インストール:yum install gd-devel-2.0.35-26.el7.x86_64.rpm,再次编译。
4)make && make install 安装
3、启动脚本做软链接: ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t ##检测配置文件语法
nginx ##启动nginx
4、修改配置
1)查看nginx的默认配置文件:vim //usr/local/nginx/conf/nginx.conf
2)修改用户,让nginx以nginx用户和用户组启动。
3)检测配置文件语法 :nginx -t 修改了nginx用户和组后检测会报错,需要手动创建nginx用户
4)添加nginx用户:useradd nginx
,此时就不报错了。
useradd -s /sbin/nologin -M -d /usr/local/nginx/ nginx
创建用户
再次加载nginx的配置可能会出现报错:
nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
#解决:删除/usr/local/nginx/logs/nginx.pid,再重新启动
5)此时 ps aux,可看到两个nginx进程,一个是root用户开启的master进程,一个是由nginx用户开启的worker进程
2.2调优
5、升级nginx的配置,调优
开启的work进程数是由cpu的总核心数决定的(有几核就有几个work进程)
1) 修改虚拟机cpu核心数(虚拟机关机)
2)查看逻辑CPU的个数:cat /proc/cpuinfo | grep “processor” | wc -l 发现是4核的
3)修改nginx开启的work进程数:vim //usr/local/nginx/conf/nginx.conf,并且重置nginx nginx -s reload
user nginx nginx;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
- nginx默认没有开启利用多核cpu,这样配置后,在计算最费时的资源时,使用的cpu核数越多,越快,'0001’从左到右一次表示第四,第三,第二,第一个cpu核心,0表示关闭,1表示开启
此时可以看到开启了4个work进程。
4)修改并发连接数:vim //usr/local/nginx/conf/nginx.conf,并且重置nginx nginx -s reload
worker_connections 65535 :
单个后台worker process进程的 最大并发链接数 そしてまた、開いているファイルの最大数を制限するには、Linuxシステムのプロセスによって有効にする「のulimit -n 65536」を設定を変更する必要があります。epoll
一つの方法は、IO多重化されている(I / O多重化)されているが、唯一の大幅nginxの性能を向上させることができ、カーネルlinux2.6上記ため、nginxのは、それによって高度に並行ためIOモデルです。nginxのサポートを選択し、投票のepoll、kqueueの、 Resig氏は、/ dev / poll.kqueue BSDシステムに対応した効率的なIOモデルは、Linuxシステムへの効率的なモデルの対応をepollを。I/O多路复用
:I / Oストリームの中ならば、我々はI / Oストリームを処理するためのプロセスを開始します。今、私はその後、我々はこれらのI / Oストリームに対処するために百万1つの対応プロセスを有効にする必要があり、百万I / Oストリームで今があると仮定( - これは伝統的な意味でのマルチプロセスの並行処理です)。あなたのCPU使用率が高く、実装と無理だろう、百万プロセスについて考えてみてください。人々はモデルを多重前方のI / Oを入れたので、スレッドは、I / Oの複数を管理するI / Oストリームの状態を記録することによって、サーバのスループット能力を増大させることができます
psの補助プロセス、猫の/ proc / 2212 /制限を表示するには
そうでない場合、我々は65535を期待して、
ulimit -a #查看系统的最大打开文件数
ulimit -n 65535 #更改系统配置,立即生效
nginx -s reload
そして、もう一度確認してください。
三、nginxのメインコンフィギュレーション・ファイルの構造
user www www;
# (1)程序运行用户和组-->nginx
worker_processes auto;
# (2)启动进程,指定 nginx 启动的工作进程数量;建议按照 cpu 数目来指定,一般等于cpu核心数目
error_log /home/wwwlogs/nginx_error.log crit;
# (3)nginx全局错误日志
pid /usr/local/nginx/logs/nginx.pid;
# (4)主进程 PID 保存文件
worker_rlimit_nofile 51200;
# (5)文件描述符数量
# (6)事件区块开始-->events
events {
use epoll;
# (1)使用 epoll 模型,对于 2.6 以上的内核,建议使用 epoll 模型以提高性能
worker_connections 51200;
# (2)一个工作进程能处理的最大连接数量
}
# (7)http区块的开始
http {
# 解决中文-->后续补充
# server里面是一些网站优化参数
server {
# (1)具体的某一网站的配置信息
listen 80;
# (2)监听端口-->-->可以写成IP:Port的形式
root html;
# (3)网页根目录(/usr/local/nginx/html)
server_name www.wzj.com;
# (4)提供服务的域名主机名!
index index.html;
# (5)默认加载页面-->多个优先级!
access_log logs/access.log;
# (6)访问日志保存位置
location (.*)\.php$ {
# 用正则匹配具体的访问对象-->php结尾的
}
location {
# 跳转等规则-->rewrite
}
} # server的匹配结束
server {
# 虚拟主机;
}
} # http结束区块