nginx是一个HTTP服务器,反向代理服务器,邮件代理服务器,一个通用的TCP/UDP代理服务器,应用极为广泛。
- 提供HTTP和反向代理服务
提供静态和index文件服务,带有缓存的反向代理,负载均衡和故障转移,支持HTTP / 2
基于名称和IP的虚拟服务器,keepAlive和Pipeline支持,
3XX-5XX错误码重定向,基于正则的URI重改,基于客户端IP/认证的访问控制,
响应速率限制,限制来自同一个地方的连接和请求限制
等等 - Mail proxy server
- TCP/UDP 代理服务器功能
TCP/UDP的通用代理(曾经面试被问到过),负载均衡和故障转移,基于client address的访问控制,连接数量限制
nginx有一个Master进程和几个worker进程,master进程主要负责读取执行配置文件,管理维持woker进程。worker进程工作在没有特权的用户下,实际负责处理请求,基于event模型来分配请求,worker进程的数量可以在配置文件指定,也可以根据系统CPU数量自动调整。
nginx.conf文件提供了灵活的配置,并且不需要重启服务,即可不间断的提供服务。占用内存极少,10 000个不活动的keep-alive 连接只占用2.5M内存。
安装启动
windows直接到nginx官网下载下载即可,linux下安装点击这里
mac下安装nginx一般利用brew安装
brew search nginx
查询nginx是否安装
brew info nginx
这个命令非常有用,展示nginx的配置文件所在和启动命令
brew install nginx
安装nginx
安装后open /usr/local/etc/nginx/
可以看到有nginx.conf和servers文件夹,open /usr/local/Cellar/nginx
是nginx安装的地方,进入里面可以看到bin下面是nginx的启动文件,html的快捷方式真正指向的是上面info命令说明的/usr/local/var/www
目录
nginx
或brew services start nginx
启动,mac下可以在任何目录输入前述指令,-c filename
加载指定配置文件,来代替缺省的。
nginx启动后就可以通过nginx -s parameter
来控制nginx:
nginx -s reload
重新加载配置文件使其生效。master进程在收到重新加载配置文件的指令后,会检查新配置文件的语法,检查通过后就会开启新的worker进程去处理请求,然后发信号通知旧的worker进程停止,旧的worker进程收到停止命令后会停止接受新请求,在处理完当前请求后退出。
nginx -s quit
平稳关闭Nginx结束web服务,会等待当前worker进程处理完请求。nginx -s stop
快速关闭Nginx终止web服务。在Linux中也可以通过kill -s QUIT <master进程 PID>
来正常关闭nginx,master进程PID会写入/usr/local/nginx/logs or /var/run文件夹中,也通过ps -ax | grep nginx
可以查询nginx进程PID
nginx -s reopen
重新打开日志文件。
nginx -t
不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v
显示 nginx 的版本。
nginx -V
详细的显示 nginx 的版本,编译器版本和配置文件所在位置等。
nginx配置文件详解
nginx的使用最重要在于配置文件nginx.conf,nginx由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令:
简单指令由名称和用空格隔开的参数组成,以分号(;)结束。
块指令由名称和一组{ }包围的附加指令组成。如果一个块指令可以在括号内有其他指令,则称为上下文(例如:events、http、server和location)。放在配置文件中任何上下文之外的指令被认为是在主上下文中。
如下:
events和http指令位于主上下文中,server位于http中,location位于server中。
worker_processes 1;
events {
worker_connections 1024;
}
http {
keepalive_timeout 65;
server {
listen 8081;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
#号之后的表示注释。
主要配置指令
#运行用户
#user somebody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志
error_log D:/Tools/nginx-1.10.1/logs/error.log;
error_log D:/Tools/nginx-1.10.1/logs/notice.log notice;
error_log D:/Tools/nginx-1.10.1/logs/info.log info;
#PID文件,记录当前启动的nginx的进程ID
pid D:/Tools/nginx-1.10.1/logs/nginx.pid;
#工作模式及连接数上限
events {
worker_connections 1024; #单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型(邮件支持类型),类型由mime.types文件定义
include D:/Tools/nginx-1.10.1/conf/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 D:/Tools/nginx-1.10.1/logs/access.log main;
rewrite_log on;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
keepalive_timeout 120;
tcp_nodelay on;
#gzip压缩开关
#gzip on;
#设定实际的服务器列表
upstream zp_server1{
server 127.0.0.1:8089;
}
#HTTP服务器
server {
#监听80端口
listen 80;
#定义使用www.xx.com访问
server_name www.helloworld.com;
#首页
index index.html
#指向webapp的目录
root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;
#编码格式
charset utf-8;
#代理配置参数
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr;
#反向代理的路径(和upstream绑定),location 后面设置映射的路径
location / {
proxy_pass http://zp_server1;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root D:\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
#过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
expires 30d;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}
#错误处理页面(可选择性配置)
#error_page 404 /404.html;
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root html;
#}
}
}