Nginx介绍
模块化设计
Nginx 的 worker 进程分为核心模块和功能性模块。
核心模块主要负责维持一个运行循环(run-loop),在其中执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。
Nginx 的代码采用了模块化设计,这使得我们可以根据需要选择和修改功能模块,然后编译成具有特定功能的服务器。
正向代理
反向代理
负载均衡
1、安装nginx
参考https://www.cnblogs.com/hanyinglong/p/5102141.html
如出现/bin/sh: ./configure: No such file or directory make[1]: *** [auto/lib/pcre/Makefile] Error 127
表示pcre安装目录不正确,需要重新按照教程安装pcre
cd /usr/local/nginx/sbin/
./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
表示安装成功
./nginx -c /usr/local/nginx/conf/nginx.conf
启动nginx
2、配置log
配置文件存在 /usr/local/nginx/conf/nginx.conf
添加
log_format main '$remote_addr - $remote_user [$time_local] "$host:$server_port" "$request" '
'$status $body_bytes_sent "$request_body" "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
重启
./nginx -s stop
./nginx -s reload
3、反向代理
反向代理可以认为,能确认客户端(IP地址),通过常规途径访问服务,但在客户端配置Host域名解析,将流量导入代理服务地址。
请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。
在客户端/etc/hosts配置域名解析对应关系
127.0.0.1 8080.test.com
代理服务器需监听:80端口(TCP 默认端口80)
1.模拟2个http服务器作为目标服务器
用作测试,使用2个tomcat实例模拟http后端服务,分别为8081和8082
2.配置IP域名
127.0.0.1 8081 8081.test.com
127.0.0.1 8082 8082.test.com
3.配置nginx.conf
upstream tomcatserver1 (
server 127.0.0.1:8081;
}
upstream tomcatserver2 (
server 127.0.0.1:8082;
}
server (
listen 88;
server_name 8081.test.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver1;
index index.html index.htm;
}
}
server (
listen 80;
server_name 8082.test.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver2;
index index.html index.htm;
}
}
流程:
1)浏览器访问8080.test.com,通过本地host文件域名解析,找到192.168.72.49服务器(安装nginx)
2)nginx反向代理接受客户机请求,找到server_name为8080.test.com的server节点,根据proxy_pass对应的http路径,将请求转发到upstream tomcatserver1上,即端口号为8081的tomcat服务器。
4、常用命令
sbin/nginx 必须所属为 root ,启动才会以 root 身份启动
nginx -s reload :修改配置后重新加载生效,master进程不重启,worker进程都要重启
nginx -s reopen :重新打开日志文件
nginx -t 测试nginx配置文件是否正确
关闭nginx:
nginx -s stop :快速停止nginx,master进程和worker进程均停止
quit :完整有序的停止nginx
启动nginx: nginx -c /path/to/nginx.conf
平滑重启nginx:kill -HUP 主进程号
5、Nginx出现403 forbidden (13: Permission denied)
查看Nginx进程用户,是否是nobody。在conf/nginx.conf 中设置 user root/work 等对文件有可读或可写权限的用户。
6、Nginx支持域名泛解析
修改nginx.conf中server_name为泛域名
sever{
listen 80;
server_name *.test.com;
access_log /home/work/nginx/access.log main;
location /{
proxy_pass http://127.0.0.1:8080;
}
}
7、请求限速性转发limit_req_zone
limit_req_zone
限速,每秒10个,内存区域10m,大概16万个session
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server
{
listen 80;
server_name xxx.xxx.xxx;
location / {
#缓存区队列burst=100个,不延期,即每秒最多可处理rate+burst个.同时处理rate个。
limit_req zone=one burst=100 nodelay;
proxy_pass http://service;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 120; #长时操作的设置
}
}
zone:one:10m 表示一个内存区域大小为10m,并且设定了名称为one.
rate=5r/s 表示请求的速率是1秒5个请求,当单位设置成60r/m时,并不能达到限速1分钟60次的效果,它等同于1r/s。
$binary_remote_addr 表示远程的ip地址,当此nginx前方还存在代理时,需进行处理
2.2 limit_req的参数
zone=one 表示这个参数对应的全局设置就是one的那个内存区域
burst=100 表示请求队列的长度。
nodelay 表示不延时,比如rate=5r/s,burst=10 那么来了15个请求,能一次搞定,否则,就是此秒只能搞定5个请求。一般都是不延期的设置。
8、Nginx使用Stream实现DB流量转发
下载1.9以上版本只有1.9以上版本才支持,安装过程略
注意编译的时候加上--with-stream
./configure --with-stream --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf
nginx stream conf
stream{
upstream db {
server 127.0.0.1:3306;
}
# test-db
server {
listen 13006;
proxy_timeout 525600m;
proxy_pass db;
}
}
9、Nginx模块加载
nginx按照模块类型的先后顺序加载:
核心模块 > 事件模块 > 线程池模块 > http模块 > 邮件模块 > stream模块 > 其他模块
核心模块
ngx_core_module
ngx_errlog_module
ngx_conf_module
ngx_openssl_module
ngx_regex_module
事件模块
ngx_events_module
ngx_event_core_module
ngx_epoll_module
ngx_selet_module
ngx_poll_module
其他事件模块
http模块
参考ngx_modules.c 中定义的ngx_modules 数组中http类模块顺序
邮件模块
需要在configure时制定 --with-mail,具体模块参考 ngx_modules 数组中mail类型模块顺序
stream模块
需要在configure时制定 --with-stream,具体模块参考 ngx_modules 数组中stream类型模块顺序
其他模块
具体模块参考 ngx_modules 数组中其他类型模块顺序
10、Nginx Master和Worker工作模式
master进程
1.接收外界的信号,例如:kill -QUIT,kill -HUP
kill -HUP 重新加载配置文件,然后重新启动新的worker进程,老的还在运行,同时,向老的worker进程发送退休命令,老的worker进程将原有的请求处理完之后,就退休,不会接收新的请求,自毁,新的worker进程处理新的请求。
2.向各个worker进程发送信号
3.监控worker进程
4.当worker进程因异常退出,会自动启动新的worker进程。kill -9 worker后,master会立即拉起worker
5.master进程被kill,worker进程仍在,客户端请求依旧可以继续处理
6.如果listen port被占用,master、worker进程整体会启动失败
woker进程
处理客户端的请求
接收客户端的连接,完成服务端和后端的数据交互,各个worker之间的进程是相互独立的并且平等的,对请求的处理机会是相等的。
工作原理
当启动nginx时,maste进程启动的时候,会创建好Listener的一个socket监听,然后会fork出多个worker进程(根据配置文件),当有请求来临时,worker进程会通过共享锁来保证在同一时刻只有一个worker进程来处理同一个连接,当worker进程接收到请求的时候,就开始做数据的响应和处理,哪一个进程抢到锁,哪一个进程就会处理请求。
nginx是一个壳,由内核和模块组成,主要是核心、基础、第三方模块。其中,核心模块:http模块,event模块、mail模块。