Nginx的功能特性
- 基本Http服务,可以作为Http代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL
- 高级Http服务,可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等
- 邮件代理服务器,支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能
基本HTPP服务
- 处理静态文件,如HTML网页以及请求
- 打开并自行管理文件描述符缓存
- 提供反向代理服务,并且可用缓存加速反向代理
- 提供远程FastCGI(通用网关接口)服务的缓存机制
- 模块化提供过滤器功能,gzip压缩 ranges支持 chunked响应 XSLT SSI 图像缩放 针对包含多个SSI的页面,经由反向代理SSI过滤器可并行处理
- 支持安全套接协议SSL
高级HTTP服务
- 支持基于名字和IP的虚拟主机设置
- 支持HTTP/1.0 中的keep-alive模式和管线模型(PipelLined)连接
- 支持重新升级时,无需中断正在处理的请求
- 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转
- 提供3xx 5xx错误代码重定向功能
- 支持重写模块扩展
- 支持HTTP DAV模块,从而为HTTP DAV模块提供PUT DELETE MKCOL COPY MOVE方法
- 支持FLV流和MP4流传输
- 支持网络监控,访问控制、速度限制或请求限制等
- 支持嵌入perl语言
邮件代理服务
- 支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持IMAP认证方式和POP3认证方式
- 支持使用外部HTTP认证服务器器认证用户后重定向连接到内部SMTP后端,并支持SMTP认证方式
- 支持邮件代理服务下的安全套接层安全协议SSL
- 支持纯文本通信协议的扩展协议STARTTLS
常用功能
- HTTP代理和反向代理
请求稳定,后端转发与业务配合分离,配置灵活,支持判断表达式
- 负载均衡
- 将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总给用户提高网络系统的处理能力
- 将大量的前端并发访问或者数据流量分担到多个后端网络节点上分别处理
- nginx的负载均衡策略
- 内置策略:轮询 加权轮询 IP HASH
- 扩展策略 主要通过第三方模块实现,常见有url hash
- WEB缓存
主要由Proxy_Cache(提供代理服务时,对后端服务器返回内容进行URL缓存) 和FastCGI_Cache(对FastCGI程序缓存)指令集构成 http://nginx.org/download/nginx-1.15.7.tar.gz
安装部署
编译
- 下载nginx-1.12.1.tar.gz
- 解压后进入nginx-1.12.1目录执行 ./configure –prefix=/usr/local/nginx-1.12 需要安装gcc等编译工具 yum -y install gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
- 执行make编译,等待编译结束后执行make install安装至指定目录
- 进入/usr/local/nginx-1.12,可以看到具有4个目录:
- conf 存放了所有配置文件
- html 运行中的html文件
- logs 日志目录
- sbin 服务主程序
启停
nginx服务在运行时会保持一个主进程和一个或者多个worker process工作进程,通过给主进程发送信号控制服务的启停。
- nginx可接受的信号 kill -USR1 ${nginx.pid}
信号 | 作用 |
---|---|
TERM 或 INT | 快速停止服务 |
QUIT | 平缓停止服务 |
HUP | 平滑重启 |
USR1 | 重新打开日志文件 |
USR2 | 平滑升级 |
WINTH | 平缓停止Worker Process |
- 常用命令
#检查配置文件是否有错误
./nginx -t
#指定配置文件
./nginx -c conf_file
#优雅停止
./nginx -s stop
配置
主要描述nginx.conf文件的内容
nginx.conf文件结构
主要由三块组成 全局块 events块 http块,http块中包含http全局块和多个server块,每个server块中包含server全局块和多个location块,采用就近原则生效
全局块
配置一些影响整体运行的指令,通常有服务器用户组 允许生成的worker process nginx.pid存放路径 日志存放路径 类型 配置文件引入
events块
影响nginx服务器与用户的网络连接,这一块的设置对服务的性能影响较大。通常有是否开启对WP下的网络进行序列化 是否允许同时接受多个网络连接 事件驱动模型 每个WP可以同时支持处理的最大连接数
http块
重要组成部分,代理、缓存和日志定义、第三方模块的配置。 通常配置 文件引入 MIME-TYPE定义 日志自定义 是否使用sendfile传输文件 连接超时时间 单连接请求数上限
具体配置
由于nginx的配置大部分是不限定具体位置的(可以在多个地方配置),所以此处将依次进行列举
配置用户组
# 配置alleyz用户 admin组下有启停权限
user alleyz [admin];
#所有用户具有启停权限
user nobody nobody;
配置运行生成的worker process
# 如果设置为数字,启动以后就具有多少个worker process
# 设置为auto则自动检测
worker_processes number | auto;
配置pid文件存放路径
默认存放在logs/nginx.pid
#必须包含文件名称
pid logs/nginx_alleyz.pid;
配置错误日志文件的存放路径
可在全局块、http块 server块 location块配置
error_log file stderr [ DEBUG info notice warn error crit alert emerg];
配置文件引入 任意地方
include file;
设置网络连接的序列化
惊群问题当某刻只有一个请求进来时,会唤醒多个睡眠的进程,造成性能的损耗 accept_mutex on | off;
设置是否允许同事接受多个连接 events
multi_accept on off; #默认关闭
事件驱动模型的选择 events
可选择的内容有:select poll kqueue epoll rtsig /dev/poll eventport use epoll;
配置最大连接数 events
允许每一个WP同事开启的最大连接数。此值不能大于操作系统支持的打开的最大文件句柄数. worker_connections number; #默认值 512
MIME-Type http server location
default_type mime-type; #默认为 text/plain
自定义服务日志
access_log 可在http server location中配置; log_format只能在http中配置。 注意 前文提到的error_log 配置的是nginx的运行日志,此处指的是应答前端请求的服务日志。可以对日志的格式、大小、输出进行配置,有access_log log_format指令, log_format 的string整体需要用’括起来,变量名称使用双引号括起来
log_format name string;
access_log path [format [buffer=size]];
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
#如果取消日志记录
access_log off;
配置sendfile方式传输文件
相关指令 sendfile sendfile_max_chunk,默认开启
sendfile on | off;
sendfile_max_chunk size; #设置为0为限制
配置连接超时时间
http块 server块 location块,设置用户会话连接的保持时间 keepalive_timeout timeout[header_timeout];
单连接请求上限
server location 用户与服务端建立连接后,通过此连接发送的请求次数 keepalive_requests number;
配置网络监听
- 配置监听IP地址
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sendbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
- 配置监听端口
listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sendbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on | off] [ssl];
- 配置Unix Domain Socket 很少用
listen unix:path [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sendbuf=size] [accept_filter=filter] [deferred] [bind] [ssl];
- 平常使用:
listen 3021; listen 10.8.177.21; listen 10.8.177.21:3022 default_server backlog==1024;
参数说明:
- address ip地址,如果是ipv6需要使用[fe13:..]格式
- port 端口号,如果只有ip则默认80
- path socket文件路径
- default_server, 标识符,将ip:port设置为默认的虚拟主机
- backlog 设置监听函数listen()最多允许多少网络连接同时处于挂起的状态,默认511(FreeBSD 为-1)
- rcvbuf 设置监听socket接受缓存区大小
- sendbuf 设置监听socket发送缓存区大小
- deferred 标识符,将accept()设置为Deferred模式
- bind 标识符,使用独立的bind()处理此adress:port,一般情况下端口相同而IP地址不同,只使用一个
- ssl 标识符,设置会话使用ssl模式(https)
- accept_filter 设置监听端口的请求过滤,被过滤的内容不能被接受和处理(只在FreeBSD NetBSD中有用)
- setfib 为监听socket关联路由表,只对FreeBSD起作用
基于名称的虚机主机设置
可以配置多个name server_name name name1 name2 ….;
- 可以使用通配符* 只能位于三段字符串组成的首尾或者两段字符串的尾部 server_name .baidu.com www.baidu.
- 使用正则表达式,~作为正则开始的标记,并且正则支持捕获 server_name ~([a-zA-Z\d]{1,4}).baidu.com$;
此时,如果通过xisuo.baidu.com访问的话,可使用$1捕获xisuo; 一个名称若被多次匹配的访问优先级:
- 匹配方式不同时
- 精确匹配
- 通配符在开始
- 通配符在结尾
- 正则表达式匹配
- 相同匹配方式时,首次处理优先(顺序)
基于IP的虚拟主机设置
需设置网卡能监听多个IP地址
# 临时生效
ifconfig em1:0 10.8.177.21 netmask 255.255.0.0 up
ifconfig em1:1 10.8.177.22 netmask 255.255.0.0 up
# 永久生效
echo "ifconfig em1:0 10.8.177.21 netmask 255.255.0.0 up" >> /etc/rs.local
# vi nginx.conf
...
server {
listen 3022;
server_name 10.8.177.32;
...
}
server {
listen 3022;
server_name 10.8.177.21;
...
}
kill -HUP `cat ../logs/nginx_alleyz.pid`
配置location块
location [ = | ~ | ~* | ^~] uri {...}
- =用于普通uri之前,表示严格匹配
- ~ uri包含正则表达式,并且区分大小写
- ~* 表示包含正则表达式,并且不区分大小写
- ^~ 如果找到与uri匹配度最高的location,立即处理请求。 会对uri进行反编码
配置请求的根目录 http server location
服务器收到请求后查找资源的根目录路径,可以使用nginx预设的大多变量,唯$document_root $realpath_root不能使用;通常在location块中使用。
root path;
更改location的URI
除了使用root指定根目录,还可以使用alias指令改变location接收到的请求路径
alias path;
location ~ ^/data/(.+\.(htm|html))${
alias html/data/other/$1;
}
设置网站的默认首页
可以针对不同的访问设置不同的首页
index index.html index.htm;
设置网站的错误页面 http server location
如果uri是path的话,则path是以nginx的安装目录为根路径的;
error_page code ... [=[response]] uri;
error_page 404 /404.html;
error_page 404 http://someone.com/404.html;
如果希望错误路径指向自定的位置:
error_page 404 /404.html
location /404.html{
root /home/alleyz/html;
}
基于IP配置访问权限 http server location
allow address | CIDR | all;
deny address | CIDR | all;
location / {
root html;
index index.html;
deny 10.8.177.26;
}
基于密码配置访问权限
基于HTTP Basic Authentication 协议认证;文件中密码得加密!
# 生成密文,-c创建密码文件 -d采用crypt加密 -b 命令行指定密码
htpasswd -cdb passwd root 123456
# string 开启认证功能,并设置提示信息
auth_basic string | off;
#file 包含用户名信息的文件路径
auth_basic_user_file file;
我自己的配置
user root;
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;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#资源压缩
gzip on; #开启gzip
gzip_min_length 1k; #低于1kb的资源不压缩
gzip_comp_level 6; #压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右。
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css image/jpeg image/gif image/png; #需要压缩哪些响应类型的资源,多个空格隔开
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on; #是否添加“Vary: Accept-Encoding”响应头
##cache##
proxy_connect_timeout 500;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout 600;
#连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
proxy_send_timeout 500;
#后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
proxy_buffer_size 128k;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffers 4 128k;
#同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
proxy_busy_buffers_size 256k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_temp_file_write_size 128k;
#proxy缓存临时文件的大小
proxy_temp_path /usr/local/nginx/temp;
#用于指定本地目录来缓冲较大的代理请求
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=2g;
#设置web缓存区名为cache_one,内存缓存空间大小为12000M,自动清除超过15天没有被访问过的缓存数据,硬盘缓存空间大小200g
server {
listen 80;
server_name www.cdxc512.cn;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_set_header Host $http_host; #解决浏览器访问网站时跳转内网127.0.0.1的问题
proxy_pass http://127.0.0.1:8080;
# root html;
# index index.html index.htm;
}
#要缓存文件的后缀,可以在以下设置。
location ~ .*\.(jpeg|gif|jpg|png|ico|css|js)(.*) {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
#proxy_set_header Host $http_host;
proxy_cache cache_one;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 301 30d;
proxy_cache_valid any 5m;
expires 30d;
add_header wall "get data from cache success";
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}