Nginx配置文档:http://nginx.org/en/docs/
NGINX 安装文档:https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/
nginx模块及中文手册:http://www.nginx.cn/doc/index.html
应用层:nginx、haproxy、apache、varnish
LNMP:linux+nginx+mysql+php
I/O模型
同步阻塞讲解
同步阻塞
同步非阻塞
event dirver
一、NGINX简介
sendfile本身是一种技术,帮助系统省去了一些步骤,比如nginx对用户请求做出相应并从内核交流取得数据,然后再封装给网络协议的一个过程。sendfile提高了web服务的性能。
传统上基于进程和线程模型架构的web服务通过每进程或者每线程处理并发连接请求,势必会在网络和IO上产生阻塞,这样产生的结果必然是对内存和cpu利用率的降低,为了改变这种状况就会产生出一个新的进程或者线程,需要对事先准备好起运行环境,这包括为其分配内存堆和栈、以及为其创建新的执行上下文等,这些操作都需要占用cpu,而过多的线程还会带来线程抖动和频繁的上下文切换,系统性能也会有进一步下降。
在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型,受启发于多种操作系统赛尔号中基于“事件”的高级处理机制,nginx采用了模块化,事件驱动,异步,单线程以及非拥塞的架构,并大量采用了多路复用即事件通知的机制,在nginx中,连接请求由为数不多的几个仅仅包含一个线程的进程worker以高新的回环机制进行处理,而每个worker可以并行处理数千个并发连接和请求,。
nginx会按需同时运行多个进程,一个主进程和几个工作进程,配置了缓存时还会有缓存加载器进程和缓存管理器进程等、所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间的通信,主进程以root用户身份运行,而worker、cache loader 和cachemanager均应以非特权用户身份运行。
二、NGINX主要特性
主进程主要完成的任务:
1、读取并验证配置信息。
2、创建、绑定及关闭套接字、
3、启动、终止及维护worker进程的个数。
4、无须终止服务而重新配置工作特性。
5、控制非中断式程序升级,启动新的二进制程序并在需要的时候回滚至老版本。
6、重新打开日志文件,并实现日志滚动。
7、编译嵌入式perl脚本。
8、不支持动态加载模块的功能,所以需要的模块需要一次性编译好。
worker进程主要完成的任务
1、 接收、传入并处理用户端的连接。
2、提供反向代理即过滤功能。
3、nginx任何能完成的其他功能。
实现缓存需要的进程:
cache loader进程主要完成的任务
1、检查缓存存储中的缓存对象。
2、使用缓存元数据建立内存数据库
cache manager进程的主要任务
1、缓存的失效和过期检查。
三、安装nginx
1、依赖关系
编译安装nginx需要事先安装开发包组“Development Tools”,同时,还需要专门安装pcre-devel软件包,zlib、openssl软件包。
[root@node6.dtedu.com ~/nginx-1.9.12]# yum install openssl-devel pcre-devel
[root@10 nginx-1.9.12]# yum groupinstall 'Development Tools'
a、pcre软件包,主要响应nginx的核心和rewrite模块功能,支持正则表达式
注意一点,在编译安装的时候使用--with-pcre=指向的路径是pcre文件的源码包路径,而不是安装路径。其他软件包也是一样的需要指向未安装的源码包。
b、zlib,支持nginx的头文件压缩
c、openssl,支持nginx的ssl模块,实现https功能。
首先添加用户nginx,实现运行nginx服务的进程
[root@10 nginx-1.9.12]# groupadd -r nginx
[root@10 nginx-1.9.12]# useradd -r -g nginx nginx
-r:创建系统账号
-g:指定用户的初始化用户组
-M:不创建用户的家目录
-s:指定用户登录的shell
-m:指定用户的家目录
编译参数:
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --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_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_spdy_module --with-ipv6
[root@node6.dtedu.com ~/nginx-1.9.12]#
./configure --prefix=/usr/local/nginx/ --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/accesslog --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcig --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
查看启动状态:
[root@node6.dtedu.com ~/nginx-1.9.12]# ps -axu |grep nginx
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 7191 0.0 0.0 44648 1164 ? Ss 09:25 0:00 nginx: master process nginx
nginx 7192 0.0 0.1 45080 2004 ? S 09:25 0:00 nginx: worker process
基本配置文件及目录
[root@10 nginx-1.9.12]# ll /etc/nginx/
total 60
-rw-r--r--. 1 root root 1077 Aug 15 13:13 fastcgi.conf
-rw-r--r--. 1 root root 1077 Aug 15 13:13 fastcgi.conf.default
-rw-r--r--. 1 root root 1007 Aug 15 13:13 fastcgi_params
-rw-r--r--. 1 root root 1007 Aug 15 13:13 fastcgi_params.default
-rw-r--r--. 1 root root 2837 Aug 15 13:13 koi-utf
-rw-r--r--. 1 root root 2223 Aug 15 13:13 koi-win
-rw-r--r--. 1 root root 3957 Aug 15 13:13 mime.types
-rw-r--r--. 1 root root 3957 Aug 15 13:13 mime.types.default
-rw-r--r--. 1 root root 2656 Aug 15 13:13 nginx.conf
-rw-r--r--. 1 root root 2656 Aug 15 13:13 nginx.conf.default
-rw-r--r--. 1 root root 636 Aug 15 13:13 scgi_params
-rw-r--r--. 1 root root 636 Aug 15 13:13 scgi_params.default
-rw-r--r--. 1 root root 664 Aug 15 13:13 uwsgi_params
-rw-r--r--. 1 root root 664 Aug 15 13:13 uwsgi_params.default
-rw-r--r--. 1 root root 3610 Aug 15 13:13 win-utf
四、配置文件
nginx的配置有着几个不同的上下文:main、http、server upstream和localtion、实现邮件和反向代理
配置的语法格式和定义凡事遵循C的风格,因此支持嵌套、还有逻辑清晰、易于常见、阅读和维护的优势。
nginx的代码事由一个核心和一系列的模块组成,核心主要用于提供web server的基本功能,以及web和mail反向代理的功能,用于启动网络协议,常见必要的运行时的环境即确保不同的模块之间的平滑交互,不过,大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的,这些功能模块大致可以分为事件模块、阶段性处理器、输出处理器、变量处理器、协议、upstream和负载均衡几个类别,这个模块主要用于通过os独立事件的通知,协议模块负责实现nginx通过HTTP、tls、smtp、pop3与对用的客户端建立会话。
全局配置:
用于控制所有协议的属性。
协议配置:
http{
server{
location /url{
root /path/to/somewhere
}
}
}
location和director的区别:
location用来控制URL,而director用来控制本地访问目录的。
1、核心模块(常用)
全局配置:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
1、events{ } 用于定义事件,用于设定nginx工作模式和客户链接上限。
常用命令:
use:设定工作模式,自行完成,不需要设置
worker_connections:设定worker进程的用户连接数
2、worker_processes:用来设定worker进程的个数。
连接数=worker_process*worker_connections
3、worker_cpu_affinity:设置工作进程绑定在那个cpu上通过二进制表示,比如0010表示第二颗cpu。
4、worker_rlimit_nofile:表示一个工作进程可以打开的最大文件个数。默认为51200
可以通过/etc/securitys/limits.conf来设定
调整系统的默认最大文件句柄数:ulimit -n
通过文件修改:/etc/security/limits.conf
nginx nofile 51200
此方法适用于很多场景,这里也可以不用设置,因为nginx会自动修改系统默认值
5、worker_priority:设置nginx访问内核的优先级。
6、user:设置
7、error_log:定义日志文件存储位置。
error_log file |stderr|syslog:server=address [debug|info|notice|warn|error|crit|alert|emerg]
实例:
error_log syslog:server=10.40.0.229,facility=local7,tag=nginx error
error_log syslog:server=10.40.0.229,facility=local4 debug;
如果不加facility就是默认存放在message文件中。
实例:
user nobody;
worker_processes 4;
worker_rlimit_nofile 51200;
error_log syslog:server=10.40.0.229 notice;
events {
use epoll;
worker_connections 51200;
}
2、http配置:
http { : server { : listen 80 default; : server_name _ *; : access_log logs/default.access.log main; : location / { : index index.html; : root /var/www/default/htdocs; : } : } }
常用指令:
1、server:用来定义虚拟主机,最简单的配置方法就是定义listen、server_name、root。
server{
listen 10.40.0.227:8888;
server_name localhost;
root /var/tmp/nginx/;
}
a、listen address:<port;> //定义监听端口号码
b、root </path> //定义网页路径,如果没有写绝对路径,那么相对路径指的是安装目录下的目录。
[root@localhost nginx-1.9.12]# ll /usr/local/nginx/html/
50x.html index.html
c、index index,html //定义默认访问的文件格式。
d、location [=|~|~*|^~] url {} //用在server和location中,定义URL路径属性。
=:精确匹配
~:模式匹配,区分大小写
~*:模式匹配,不区分大小写
^~:不被当前模式匹配,取反的意思。
=优先级最高,^~次之,模式匹配再次之,什么都没有最低。
官网样例演示:
location = / {
[configuration A]
}
location / {
[configuration B]
}
location /documents/ {
[configuration C]
}
location ^~ /images/ {
[configuration D]
}
location ~*\.(git|jpg|jpeg)$ {
[configuration E]
}
请求“/”,匹配A
请求“/index.html”,匹配B
请求“/documents/document.html”,匹配C
请求“/images/1.gif”,匹配D
请求“documents/1.jpg”,匹配E
e、server name <hostname;> 定义虚拟主机名称
f、error_page <code> uri: 指定错误代码显示的网页内容,实验未成功。
fastcgi_intercept_errors on;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /var/tmp/nginx/404.html;
}
g、access,通过ip地址进行访问控制
locatin /{
deny 10.40.0.55;
}
h、auth_base <authname> 通过用户名密码进行web登录管理
auth_basic_user_file
[root@localhost ~]# htpasswd -c -m /etc/nginx/.htpasswd gongbing
New password:
Re-type new password:
Adding password for user gongbing
server{
listen 10.40.0.227:8888;
server_name localhost;
location /{
root /var/tmp/nginx/;
auth_basic "auth_login";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
i、autoindex on 开启目录遍历功能,适用于下载。
j、add_header <name> <variable>自定义请求首部字段
server{
listen 10.40.0.227:8888;
server_name localhost;
location /{
root /var/tmp/nginx/;
auth_basic "auth_login";
auth_basic_user_file /etc/nginx/.htpasswd;
add_header X_src_server $server_addr;
}
}
k、rewrite regex replacement [last|break|redirect|permanent]
url地址重写功能,重定向。
可以通过if进行判断然后重写。
break和return来定义是否跳出当前判定或者循环。break是跳出,不检查
set可以自定义变量。
last:重启循环(判断)并在替换后再重新检查规则
break:匹配后停止并退出当前规则。
redirect:重定向到新路径,而不替换源路径,并重新检查。302,临时重定向
permanent:重定向到新路径,而不替换源路径,并重新检查。301,永久重定向
实例1:
[root@localhost ~]# tree /var/tmp/nginx/
/var/tmp/nginx/
├── client
├── fcig
├── forum
│ └── index.html
├── index.html
├── proxy
└── scgi
server{
listen 10.40.0.227:8888;
index index.html;
server_name localhost;
location / {
root /var/tmp/nginx/;
index index.html;
add_header X_src_server $server_addr;
rewrite /bbs/(.*)$ /forum/$1 last;
}
}
2、http{ }
a、include mime.types;
b、default_type application/octet-stream;
c、log_format <logname> ‘$remote_addr - $remote_user [$time_local],”$request”’ ‘$status $body_bytes_send “$http_referer”’ ‘"$http_user_agent” “http_x_forwarded_for” ‘
用于记录日志文件的格式,主要是记录那些内容。
d、access_log path format
access_log syslog:server=address format
默认:access_log log/access.log combined;
e、keepalived_time 5 设置时长
3、if(condition){ } 条件判断语句,存在于rewrite模块中。应用领域是server、location模块中。
正则表达式模式匹配:
~:与指定的正则表达式模式匹配时返回“真”,判断匹配时区分大小写。
~*:与指定的正则表达式模式匹配时返回“真”,判断匹配时不区分大小写。
!~:与指定的正则表达式模式不匹配时返回“真”,判断匹配时区分大小写。
!~*:与指定的正则表达式模式不匹配时返回“真”,判断匹配时不区分大小写。
文件及目录匹配判断:
-f,!-f:判断指定的路径是否存在且为文件。
-d,!-d:判断指定的路径是否存在且为目录。
-e,!-e:判断指定的路径是否存在,文件或目录均可。
-x,!-x:判断指定的路径是否存在且为可执行文件。
实例:
a、判断请求报文是以jpg、png、gif结尾的uri连接。
If ($request_uri ~* \.(jpg|png|gif)$){
}
location ~* \.(jpg|png|gif)$){
}
b、判断请求的主机是www.magedu.com的报文。
if ($host = “www.magedu.com”) {
}
4、stub_status 启动nginx的状态监控模块,定义在server模块中。
locatin /status123 {
stub_status on;
access_log off;
}
active connecttions:对后端发起的活动连接数
Server accepts handled requests:
420已处理过的连接
420成功创建的握手
455表示处理的请求数
reading:读取到客户端的header信息数
writing:返回给客户端的header信息数
waiting:开启keep-alive的情况下,等于active-(reading+writing)
5、gzip 压缩页面数据,有利于传输提速。
gzip on|off;
gzip_buffers number size;