一、Nginx的程序架构
我们从图中可以看到,我们nginx有master,负责管理子进程worker,对nginx的worker来讲,每一个work都可以处理多个用户请求,他们是基于http或https来处理用户请求的。我们图中描述的是nginx作为反代时的一种情况,我们可以看到接收到用户请求后他会反代给后端的web server,或通过FastCGI协议反代给我们后端的fpm server,或者通过memcache协议反代给后端的memcache server。 为什么一个进程可以响应多个请求呢?我们可以看到,在网络IO方面他通过kevent,epoll,select来处理网络的多路管理。并且在收到用户请求以后nginx自己还可以实现管理缓存,这就意味着后端服务器的响应内容我们可以先缓存在nginx本地,而后再给客户端响应,随后第二个客户端请求再进来的时候我们可以看看缓存中是否有,如果有的话我们就直接从本地缓存直接返回了,这就实现了加速访问。而为了管理缓存空间,nginx需要两个线程来管理,第一个是Cache loader,第二个是Cache manager。
整个nginx大体利用了这几个特性,首先是Event-driven,即事件驱动,然后是Asynchronous,即异步。最后是Non-blocking,即非阻塞模型
对于磁盘IO来讲,他可以支持Advanced I/O,即高级IO,sendfile,AIO(异步IO),mmap etc即内存映射,我们对于内存映射可以这样来理解,我们说过一个数据要想被访问首先第一步要先从磁盘到内核内存,然后从内核内存到进程内存,即有两次的复制过程,而我们的内存映射是指直接从内存中开辟出一段空间来,数据在磁盘上直接映射到内存空间中来,然后进程就可以访问了而不用复制了。其实这是内核的功能,只是说nginx支持这种功能来实现文件访问。
1、master/worker模型,worker负责处理用户请求,master负责装载配置文件,管理worker进程和平滑升级。
a、一个master进程
(1)、负责加载和分析配置文件,管理worker进程,平滑升级
b、一个或多个worker进程
(2)、处理并响应用户请求
c、缓存相关的进程:
(1)、cache loader:载入缓存对象
(2)、cache manager:管理缓存对象
2、特性:异步,事件驱动和非阻塞
a、并发请求处理:通过kevent/epoll/select,/dev/poll,我们主要通过epoll,只有主机不支持epoll的时候才使用select
b、文件IO,高级IO sendfile,异步,mmap
3、nginx模块:高度模块化,但其模块早期不支持DSO机制;近期版本支持动态装载和卸载
a、模块分类:
(1)、核心模块:core module
(2)、标准模块:
1)、HTTP modules:
standard HTTP modules
Optional HTTP modules
2)、Mail modules
3)、Stream modules,叫流模块,他的功能主要实现传输层负载均衡。即传输层代理。
(3)、3rd party modules,即三方模块
4、nginx的功能
a、静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)
b、结合FastCGI/uwSGI/SCGI等协议反代动态资源请求,httpd结合php是可以把php作为模块的,但是nginx是不行的,php没有作为nginx模块的用法,所以我们要想实现nmp就只有一种方式,php工作为fpm。即nginx可以作为fpm的反向代理。
c、http/https协议的反向代理
d、imap4/pop3协议的反向代理
e、tcp/udp协议的请求转发
二、nginx的安装配置
1、官方的预制包
http://nginx.org/packages/centos/7/x86_64/RPMS/
2、编译安装
yum groupinstall "Development Tools" "Server Platform Development"
yum install -y pcre-devel openssl-devel zlib-devel (pcre-devel支持更强大的正则的引擎,zlib-devel是一个网络通信压缩库,要支持压缩传输功能就需要安装此包)
useradd -r nginx
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-alo
--with-http_dav_module:支持http dav功能,也叫分布式版本协作,即支持put和delete方法的模块,这个其实是不安全的,一般没有需要就不装他
--with-http_stub_status_module:nginx的状态页是通过此模块来实现的
--with-threads:线程池管理线程,比默认的线程管理方式,即work process单个线程管理多少个请求更加高效,即基于线程池来实现用户管理的模块
--with-file-alo:异步IO模块
make && make install
3、程序环境
a、配置文件的组成部分
(1)、主配置文件:nginx.conf
include conf.d/*.conf
(2)、fastcgi,uwsgi,scgi等协议相关的配置文件
(3)、mime.types:支持的mime类型
b、主程序文件:/usr/sbin/nginx
[root@node3 /]# nginx -h nginx version: nginx/1.12.2 Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives] Options: -?,-h : this help -v : show version and exit -V : show version and configure options then exit #查看编译时的选项,非常有用 -t : test configuration and exit -T : test configuration, dump it and exit -q : suppress non-error messages during configuration testing -s signal : send signal to a master process: stop, quit, reopen, reload #传递信号 -p prefix : set prefix path (default: /usr/share/nginx/) -c filename : set configuration file (default: /etc/nginx/nginx.conf) -g directives : set global directives out of configuration file
[root@node3 /]# nginx -V nginx version: nginx/1.12.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.lo g --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt=‘-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic‘ --with-ld-opt=‘-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E‘
c、启动服务
Unit File:nginx.service
4、配置
a、主配置文件的配置指令
(1)、directive value [value2 ...];
(2)、注意:
1)、指令必须以分号结尾
2)、支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义
set variable_name value
引用变量:$variable_name
b、主配置文件结构
main block:主配置段,也即全局配置段
event{
...
}:事件驱动相关的配置
http {
...
}:http/https协议相关的配置段
mail {
...
}
stream {
...
}
c、http协议相关的配置结构。nginx没有中心主机的概念,所以全部配置成虚拟主机,即server。
http {
...
...:各server的公共配置,就不用在server中重复写
server {
...
listen
server_name
root :指定站点根目录
alias :路径别名
location [OPERATOR] URL {
...
if CONDITION {
...
}
}:location用来指明对某一个或某一类URL的资源访问属性的定义。并且还可以基于条件来做。
}
}
41:08