Nginx特性:
模块化设计,较好的扩展性
高可靠性:采用master/worker模型。
支持热部署
不需要停机即可更新配置文件、更换日志、更新服务器版本
低内存消耗
10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存
支持event-driven,alo,mmap
Nginx基本功能:
静态资源的web服务器:
http协议的反向代理服务器:
pop3,smtp,imap4等邮件协议的反向代理(很少用)
能缓存打开的文件(元数据)、支持FastCGI(php-fpm),uWSGI(Python Web Framwork)等协议
模块化(非DSO机制),过滤器压缩zip、SSI、SSL
web服务相关的功能:
支持虚拟主机(server),keepalive,访问日志(支持基于日志缓冲,提高其性能)、url rewirte 、支持路径别名、基于IP及用户的访问控制、支持速率限制及连接数限制
Nginx架构:
master/worker
一个master进程,可生成一个或者多个worker进程
事件驱动:epoll(Linux),kqueue(FreeBSD),/dev/poll(Solaris)
支持sendFile,sendfile64
支持AIO,mmap(内存映射)
master:加载配置文件,管理worker进程,平滑级。。
worker:http服务,http代理,fastcgi代理
模块类型:
核心模块:core module
Standard HTTP module
OptionalHTTP module
Mail modules
3rd part modules
用来做什么?
静态资源的web服务器
http服务器反向代理
Nginx安装配置:
yum groupinstall "Develop Tools " "Server platform"
yum install openssl-devel zlib-devel pcre-devel
#./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-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_status_module --with-debug
#make && make install
配置文件的组成部分:
主配置文件:nginx.conf
包含文件:include conf.d/*.conf -->/etc/nginx/conf.d/*.conf
fastcgi的配置文件:fastcgi_params
uwcgi_params
scgi_params
配置文件的配置指令(必须以分号结尾):
Directive value1[value2....];
支持使用变量:
内置变量:由模块引入;
自定义变量:
set variable value;
引用变量:$variable
配置文件的组织结构:主要有以下三段
main block
event{
.... #配置系统调用的相关
}
http{
.....#http相关的所有配置
}
详解:
http配置段:
http{
....
upstream{
.....#定义一个负载均衡的容器的反向代理
}
server{
.....
servername
root
alias
location /url{
.....
}
}
server{
.....
}
}
main 配置段:
类别:
正常运行必备的配置:
优化性能相关的配置:
用于调试、定位问题的配置:
详解:
1、正常运行必备的配置:
1.user USERNAME[GROUPNAME]
指定用于运行worker进程的用户和组,如果编译的时候没有指定用户,则使用配置文件里面的
user nginx nginx;
2.pid /PATH/TO/PID_FILE
指定nginx进程的pid文件路径
pid /var/run/nginx.pid;
3、worker_rlimit_nofile #NUM;
指定一个worker进程可以打开最大的文件描述符数
worker_rlimit_nofile 1024;
4、worker_rlimit_sigpending #NUM;
指定每个用户能够发往worker进程的信号的数量;
worker_rlimit_sigpending 1024;
2、性能优化的配置:
1.worker_processes #NUM
worker进程的个数;通常应为物理CPU核心数减1
可以为“auto”,实现自动设定
2.worker_cpu_affinlty CPUMASK ..;
CPUMASK:
0001
0010
0100
work_cpu_affinity 00001 00010 00100;
3.work_priority nice:
[-20,19]
调试、定位问题的配置:
1、daemon[on|off]
是否以守护进程方式启动nginx
2、master_process on|off
是否以master/worker模型运行nginx
3、error_log /PATH/TO/ERROR_LOG level
错误日志文件目录及级别;出于调试需要,可以设定为debug,但debug仅在编译时使用“--with-debug”选项才有效。
Nginx.conf的配置:
main配置段
event{
...
}
1、worker_connection
每个worker进程所能相应的最大并发请求数量;
总数量 = worker_processes *worker_connection
2、use [epool|rgsig|select|poll]
定义使用的事件模型;建议让Nginx自动选择
3、accept_mutex[on|off]
各worker接收用户的请求的负载均衡锁;启动时,表示用于让多个worker轮流地,序列化地相应新请求;
4、lock_file /PATH/TO/LOCK_FILE;
http配置段:
http{
...
server{
...
server_name
root
}
}
套接字相关指令
1、server{}
定义一个虚拟主机;
server{
listen PORT;
server_name NAME;
root /PATH/TO/DOCUMENTROOT;
}
注意:
(1)基于port:
listen指令监听在不同的端口;
(2)基于hostname
server_name指令指向不同的主机名
2、listen
listen address[:port][default_server][ssl][http2|spdy]
listen port[default_server][ssl][http2 | spdy]
default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点;
ssl:用于限制只能通过ssl连接提供服务;
spdy:SPDY PROTOCOL(speedy),在编译时必须编译了spdy模块的情况下,用于支持SPDY协议
http2:http version2;
3、server_name NAME[NAME2...]
后可跟一个或者多个主机名;名称还可以使用通配符和正则表达式(~)
匹配顺序:
(1)首先做精确匹配,如:www.example.com
(2)匹配左侧通配符,如:*.example.com
(3)匹配右侧通配符,如:www.example.
(4)匹配正则表达式,如:~^.*\.example\.com$
(5)default_server
4、tcp_nodelay on|off
对keepalive模式下的连接是否启用TCP_NODELAY选项,默认没启动。为了避免开销,如果启动这个选项,自动会把很多小的报文合并成一个大的报文发送出去,这可能会造成一些异常,所以尽量不让合并,这个要关闭为好。
5、tcp_nopush on|off;
是否启用TCP_NOPUSH(freebsd)或者TCP_CORK(linux)选项;尽在sendfile为on时有用;默认为off;
6、sendfile on|off;
是否启用sendfile功能;
路径相关的指令:
7、root
设置web资源的路径映射,用于指明请求的URL所对应的文档目录路径;
server{
...
server_name www.example.com;
root /data/www/vhost1;
}
http://www.example.com/p_w_picpaths/logo.jpg -->/d/data/www/vhost1/p_w_picpaths/log.jpg
server{
...
server_name www.example.com;
location /p_w_picpaths/{
root /data/imgs/;
...
}
}
http://www.example.com/p_w_picpaths/logo.jpg -->/data/imgs/log.jpg
8.location [= | ~|~*|^~] url{...}
location@name{....}
功能;允许根据用户请求的URL来匹配的各个location,匹配时,此请求将被对应的location块中的配置所处理;简言之,即用于为需要用到专用配置的URL提供特定配置;
server{
...
server_name www.example.com;
root /data/www;
...
location /admin/{
....
root /data/www/admin/; #不指明就是root+ location_name
}
}
操作符:
=:URL的精确匹配;
~:做正则表达式匹配,区分字符大小写;
~*:做正则表达式匹配,不区分字符大小写;
^~:URL的左半部分匹配,不区分字符大小写;
匹配优先级:精确匹配= > ^~ > ~|~* > 不带符号的url
9、alias
只能用于location配置段,定义路径别名;
location /p_w_picpaths/{
root /data/imgs/;
}
location /p_w_picpaths/{
alias /data/imgs/;
}
注意:
root指令:相当于指定location所在的目录
/p_w_picpath/test.jpg --> /data/imgs/p_w_picpaths/test.jpg
alias指令:相当于指定/data/imgs/为 p_w_picpaths的别名,p_w_picpaths就对应到/data/imgs/目录
/p_w_picpath/test.jpg --> /data/imgs/test.jpg
访问http://../p_w_picpaths/1.jpg
10、index
index file ...;
指定默认主页面
11、error_page code ..[=[response]] url;
根据http的状态码重定向错误页面
error_page 404 /404.html
error_page 404=200 /404.html #以指定的响应码进行相应,此处指定为200 上面为404
12、try_files file1 file2... uri;
try_files file1 file2... = code;
访问的时候,会尝试查找从第一个到N-1个文件,第一个找到的就是返回给请求者的资源,若1至N-1个文件都不存在,则跳转至最后一个URI(必须不能匹配至当前location,由其他location定义的地方,防止死循环),或者返回定义的code
客户端请求相关的配置:
13、keepalive_time
设置keepalive连接的超时时长,0表示禁用长连接,默认为75s
14、keepalive_requests NUM;
在keepalive连接上所允许请求的最大资源数量,默认为100;
15、keepalive_disable none|browser...;
指明禁止为何种浏览器使用keepalive功能;
16、send_time
发送响应报文的超时时长,默认为60s。客户端两次响应时间间隔超过这个,服务端就会自动断开连接。
17、client_body_buffer_size 8k|16k;
接收客户端请求报文body的缓冲区大小,超出此指定大小,数据就不在内存中保存,将其移存到磁盘上,存在的位置,由client_body_temp_path 指定
18、client_body_temp_path path [level1 [ level2[ level3]]]
设定用于存储客户端请求body的临时存储路径及子目录结构和数量
level1 一级子目录个数
level2 二级子目录个数
level3 三级子目录个数
client_body_temp_path /var/tmp/client_body 2 2 ;
表示
19、limit_excpet METHOD{...}
对指定范围之外的其他方法进行访问控制
limit_excpet GET{
allow 192.168.80.0/24;
deny all;
}
20、limit_rate speed;
限制客户端每秒中能够传输的字节数,默认为0表示无限制。
文件操作优化相关配置
21、aio on|off;
22、directio size | off;
超过指定大小,不在内存中缓冲,直接和磁盘交互读取和存储
23、open_file_cache off|max=N [inactive = time];
Nginx可以缓存一下3中信息:
(1)文件描述符,文件大小和最近一次的修改时间
(2)打开的目录结构;
(3)没有找到的或者没有操作权限的相关信息。
max=N 表示可以缓存的最大条目上限;一但达到上线,则会使用LRU(最近最少算法)算法删除最近最少使用的缓存项目
inactive =time 表示在指定的时长内没有被访问过的缓存项视为无效项,予以删除;
24、open_file_cache_errors on|off;
是否缓存找不到其路径的文件,或者没有权限访问的文件相关信息
25、open_file_cache_valid time;
每隔多久检查一次缓存中的有效项,默认为60S;
26、open_file_cache_min_users NUM;
缓存项在非活动期限内最少应该被访问的次数;
ngx_http_access_module模块的配置(基于IP的访问控制)
27、allow address | CIDR | unix: | all;
28、deny address | CIDR | unix: | all;
应用上下文:http, server, location, limit_except
ngx_http_auth_basic_module模块的配置(basic认证)
29、auth_basic string | off;
使用http basic认证协议对用户进行认证;
30、auth_basic_user_file file;
实现用户认证的帐号文件;
文件格式:
name1:password1
name2:password2:comment
name3:password3
支持的密码格式:
(1)encrypted with the crypt() function;
(2)md5
location /admin/{
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxhtpasswd;
}
下面为生成.ngxhtpasswd文件的方法:
需要用到htpasswd命令,在httpd包中,因此需要安装这个包,但是不用启动服务。
# yum install -y httpd
# htpasswd -c -m /etc/nginx/.ngxhtpasswd tom 然后输入2次密码即可创建好tom用户
# htpasswd -m /etc/nginx/.ngxhtpasswd tom 第一次需要创建文件所以需要-c参数
ngx_http_log_module 模块的配置(访问日志)
31、log_format name string ...;
定义日志格式及其名称,日志格式通过调用内置变量来定义。
32、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
访问日志文件路径、格式名称以及缓存大小和刷写时间间隔,建议设置缓存,以提升性能,但是会面临异常退出丢失日志
example:
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log compression buffer=32k;
33、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
ngx_http_stub_status_module 模块的配置
34、stub_status;
通过指定的url输出stub_status
Active connections: 291 #当前活动的客户端连接数 包括等待的
server accepts handled requests #accepts 已接受的 handled 已处理完成的 requests 总请求数
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
#reading nginx正在读取头信息的数量
#Writing 正在发送响应报文的连接数量
#Waiting 等待nginx发送响应的空闲连接数量
ngx_http_referer_module模块配置(基于请求报文的Referer首部的值做访问控制) -->防盗链
35、valid_referers none | blocked | server_names | string ...;
none:请求报文不存在referer首部
blocked:请求报文中存在referer首部,但其没有有效值,或者非以http:// https:// 开头的
server_name:其值为一个主机名
arbitrary string:直接字符串,可使用*通配符
regular expression:以~起始的正则表达式
内置变量:$invalid_referer(所有不符合valid_referer指定定义的引用请求均为不合法引用)
example:
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;
if($invalid_referer){
return 403; #也可以做重定向,做出类似于“图片仅供XXX使用”
}
一个示例配置
user nobody;
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name www.linuxidc.com;
access_log logs/linuxidc.access.log main;
location / {
index index.html;
root /var/www/linuxidc.com/htdocs;
}
}
server {
listen 80;
server_name www.Androidj.com;
access_log logs/androidj.access.log main;
location / {
index index.html;
root /var/www/androidj.com/htdocs;
}
}
}
mail {
auth_http 127.0.0.1:80/auth.php;
pop3_capabilities "TOP" "USER";
imap_capabilities "IMAP4rev1" "UIDPLUS";
server {
listen 110;
protocol pop3;
proxy on;
}
server {
listen 25;
protocol smtp;
proxy on;
smtp_auth login plain;
xclient off;
}
}
学习视频:http://edu.51cto.com/course/course_id-5550.html
转载于:https://blog.51cto.com/autopython/1834025