最近总是有朋友问我nginx方面的问题,其实我nginx在现在的公司就是做做安装,创建虚拟主机,做做优化,有时候对于朋友问我的问题,我也无能为力,感觉自己超没面子,没办法只能自己恶补恶补下nginx的理论知识了,像我这样的人理论真心的很差啊,面试很吃亏啊,哈哈哈哈,所以我决定以后好好看看平时用到的东西的理论知识。
下面就给大家,说说我对nginx理解,多多给于意见,谢谢:
nginx 特性:
1. nginx是模块化设计的,有较好的扩展性;
2. 高可靠性
master/worker 的设计模式
加载并分析配置文件是由master来实现的
worker是nginx响应客户请求的
在nginx中master进程只能有一个,但是worker进程可以根据cpu来调整
3. 支持热部署
不停机(不停止服务)更新配置文件,更换日志文件,更新服务器程序版本,在服务不停机的情况下将老版本更新成新版本是完全没有问题的可以称之为平滑升级;
4. 低内存消耗
例如:10000个keep-alive的连接模式下的非活动连接,仅消耗2.5M内存
5. 支持event-driven,aio,mmap等较新型的IO技术
nginx的基本功能:
1. 首先大家要知道,nginx是一个静态资源的web服务器,它自身只能接受http请求并返回;
2. 可以做http协议的反向代理服务;
3. 同时nginx还是pop3,smtp,imap4等邮件服务的反向代理,这个很少用到,反正我是没有用到过
4. 能缓存打开的文件(仅限于元数据)、支持FastCHI(和php-fpm交互)等协议
5. 模块化(非DSO机制的),过滤器zip,ssi,ssl;
web服务相关的功能:
1. 虚拟主机(server),做过apache的人知道,apache有一个虚拟主机的功能,可以根据不同的端口,主机名,域名来实现,同样nginx也有这个功能
2. keepalive,长链接,多数和keepalive软件相结合来实现的,多用于负载均衡
5. 路径别名,可以在配置文件来使用alias来设置路径访问别名
6. 基于IP及用户的访控制
7. 支持速率限制及并发数控制等等,在优化的时候会修改这两项配置
还有许多,就不在这里一一介绍了
...
nginx 的基本架构:
1. master/worker模型
一个master进程,可生成一个或者多个worker进程;
通过nginx事件驱动来响应用户请求,例如:epoll,/dev/poll
消息通知功能:select,poll
支持sendfile,sendfile64
支持AIO,mmap
master:加载配置文件,管理worker进程、平滑升级
worker:http服务,http代理
模块类型:
1. 核心模块:core,module 标准的
2. Standard HTTP modules 标准的
3. Optional HTTP modules 可选的,编译的时候可选择加不加入编译
4. Mail modules 可选的,编译的时候可选择加不加入编译
5. 3rd party modules 可选的,编译的时候可选择加不加入编译
用来做什么?
1. 静态资源服务器
一般结合apache来使用,因为nginx只能处理静态资源,配合apache的话,动态访问apache静态访问nginx,更加有效的提高了访问速度;
2. HTTP服务器的反向代理
下面来简单说下源码安装nginx吧
nginx 安装配置
1. nginx在redhat是没有被收录进官方的发行版本的,所以要epl源来安装,前提是能连接互联网,直接在nginx.org官网中就有epl的yum仓库源
2. nginx有三种版本
nginx stable 稳定版本
稳定版本是nginx官方不断的修改bug的版本
nginx mainline 主线版本 不建议在生产上使用
主线版本是nginx官方不断在添加新功能,知道确定稳定好才会发行的
次版本号为偶数的, 多为传统版本
3. 编译安装nginx
1). yum -y groupinstall "Development Tools" "Server Platform Development"
2). nginx源码包安装一般依赖于以下几个组件(必须保证这三个报的开发包是安装好的)
PCRE library 主要是在url重新的时候支持poll扩展字符设定的
zlib library 传输压缩的
openssl
yum -y install openssl-devel pcre-devel zlib-devel
3). 源码包解压出来后文件介绍
*重点
*core 核心模块
*event 事件驱动模块
*http web服务模块
mail 邮件模块
misc 不变规则的杂项
os 系统本身相关的专用代码
4) ./configure --help 查询帮助
一定要使用普通用户来运维worker进程
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-debug
--conf-path=/etc/nginx/nginx.conf 指明配置文件
--user=nginx 指明用户
--group=nginx 用户所在组
--error-log-path=/var/log/nginx/error.log 错误日志
--http-log=/var/log/nginx/access.log 访问日志
--pid-path=/var/run/nginx/nginx.pid pid文件
--lock-path=/var/lock/nginx.lock lock文件
--with-http_ssl_module 默认没有启用,需要起来
--with-http_stub_status_module 启动状态页面
--with-http_gzip_static_module 支持gzip压缩
--with-debug 有必要的话,启用debug
编译完成后一定要确认epoll这个模块是被编译进去的,默认就在编译列表中的,要是没有编译成功为有大问题
5) .make && make install
4. 启动nginx服务
1). /usr/local/nginx/sbin/nginx -t 测试语法
2). /usr/local/nginx/sbin/nginx 启动nginx服务
3). /usr/local/nginx/sbin/nginx -s stop 平滑关闭服务
下面来简单说下nginx配置文件吧
nginx.conf配置文件参数介绍:
main配置段:
1. worker_connections #;
每个worker进程所能够响应的对打的并发请求数量;
worker_processes * worker_connections
请求的最大数
2. use [epoll|rgisg|select|poll]
定义使用的事件模型,建议让nginx自动选择
3. accept_mutex [on|off]
各worker接受用户的请求的负载均衡锁;启用时,表示用于让多个worker轮流序列化的响应新请求
4. lock_file /PATH/TO/LOCK_FILE;
event{
...
}
http{
...
1. server{}
定义一个虚拟主机
---基于端口,ss -tnl ---
server{
listen POST;
server_name www.b.com;
root /PATH/TO/DOCUMENTROOT
}
---基于主机名,ss -tnl ---
server{
listen POST;
server_name www.a.com;
root /PATH/TO/DOCUMENTROOT
}
2. listen指令
listen address:[post]
listen post
default_server: 默认虚拟主机,若是没有定义的话,就选择第一个虚拟主机来作为默认的虚拟主机
ssl:用于限制只能通过ssl连接提供服务
http2: http version 2;
3. server_name NAME[....];
server_name可以跟一个或者多个,还可以使用通配符和正则表达式,但是两者要分开使用
(1). 首先做精确匹配 :www.lanyulei.com;
(2). 左侧通配符 *.lanyulei.com;
(3). 右侧统配符 www.lanyulei.*
(4). 正则表达式 !\^\$
(5). default_server
4. tcp_nodelay on|off;
在keepalive模式下的连接是否使用TCP_NODELAY;推荐不使用
5. tcp_nopush on|off
6. alias
定义路径别名的,只能用于location中
7. index
index file...;
8. error_page code .. url;
根据http的状态码重定向错误页面
error_page 404 404.html
9. try_file ... ... ... ...;
设置多个主页
客户端请求相关的配置
10. keepalive_timeout 默认是75秒
设定keepalive连接的超时时长;0表示禁止长连接
11. keepalive_requests number;
在keepalive连接上所允许请求的最大资源数量:默认是100个
12. keepalive_disable
指明禁止何种浏览器使用keepalive功能
13. send_timeout 默认是60秒
当服务器发送给客户端请求的资源的时候客户端没有任何响应,就在设置的超时时间
}