Nginx是一款轻量级的反向代理服务器,也是一款轻量级的Web服务器(较少用到)
1、作为http反向代理服务器
2、作为负载均衡服务器
3、直接支持php(web服务器)
4、作为邮件代理服务器
5、帮助实现前端动静分离
…
高稳定、高性能、资源占用少、功能丰富、模块化结构、支持热部署
单台NG可支撑10万并发
以mac安装为例:
Step1:安装brew
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
Step2:安装Nginx
brew install nginx
1、测试配置是否正常
/nginx/sbin/nginx -t
2、启动nginx
/nginx/sbin/nginx
3、停止nginx
/nginx/sbin/nginx -s stop
4、重启nginx
/nginx/sbin/nginx -s reload
5、查看进程
ps -ef | grep nginx
配置文件在:安装路径/conf/nginx.conf
常见的配置文件:
1)nginx.conf:应用程序的基本配置文件
2)mime.types:MIME类型关联的扩展文件
3)fastcgi.conf:与fastcgi相关的配置(php开发时用)
4)proxy.conf:与proxy相关的配置(也可以在nginx.conf中配置)
5)sites.conf:配置Nginx提供的网站,包括虚拟主机(也可以在nginx.conf中配置)
Nginx的进程结构:
启动nginx时,会启动一个master进程,这个进程不处理任何客户端请求,主要用来产生worker进程,一个worker进程用来处理一个request。
这个方式类似于epoll reactor模型。
这个配置就是用于指定每个进程可启动的worker数,默认1024
events {
use epoll;
worker_connections 1024;
}
http模块用来指定web的反向代理
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;
...
}
log_format指定日志格式,$后面表示变量
access_log指定nginx的访问日志放到哪
从上面可以看出,nginx是模块化的方式,每个模块负责一个功能。
nginx的请求来了,可以想象成每个模块逐个走一遍,就好比责任链每个节点逐个过一遍。所以nginx的扩展性非常好:只要增减模块就行了。要增减模块,就是通过在配置文件中配置
upstream是用来做负载均衡:
upstream test1.com{
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:1111;
}
server:后端的虚拟主机
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#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://test1.com; # 指向upstream
}
}
其中,proxy_pass指nginx反向代理后指向的目标地址
nginx是由多个模块组成,所以要学习每个模块的配置使用。这些配置就类似于现成的API,使用API的方法就是我们去配置。
Nginx的模块包括:核心模块、事件模块、标准http模块、可选http模块、邮件模块、第三方模块、nginx自身的补丁等等
基本模块指nginx默认的功能模块,他们提供的指令,允许你使用定义nginx基本功能的变量。
在编译的时候不能被禁用,包括:
1)核心模块:基本功能和指令,如进程管理和安全
2)事件模块:在nginx内配置网络使用的能力
3)配置模块:提供include机制
至于nginx中都支持哪些配置,每个配置干什么用的,可参看nginx官方文档:https://nginx.org/en/docs/
Syntax: error_log file [level];
Default: error_log logs/error.log error;
Context: main, http, mail, stream, server, location
指定错误文件的位置及日志等级
每个server{}可以有自己的error_log地址
Syntax: include file | mask;
Default: —
Context: any
从外部引入文件,可以支持文件的通配符
Syntax: pid file;
Default:
pid logs/nginx.pid;
Context: main
Defines a file that will store the process ID of the main process.
默认配置就有:
pid logs/nginx.pid;
Syntax: user user [group];
Default:
user nobody nobody;
Context: main
Defines user and group credentials used by worker processes. If group is omitted, a group whose name equals that of user is used.
指谁在运行nginx,通常用root运行。但要提升安全性,可以单独指定可运行nginx的用户。
默认配置:
user nobody;
Syntax: worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main
Binds worker processes to the sets of CPUs. Each CPU set is represented by a bitmask of allowed CPUs. There should be a separate set defined for each of the worker processes. By default, worker processes are not bound to any specific CPUs.
如果服务器上有多个CPU,可以指定worker进程和CPU的绑定关系
For example,
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
binds each worker process to a separate CPU, while
worker_processes 2;
worker_cpu_affinity 0101 1010;
binds the first worker process to CPU0/CPU2, and the second worker process to CPU1/CPU3. The second example is suitable for hyper-threading.
通常没必要配置这个,用默认就可以
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
Defines the number of worker processes.
通常worker_processes是CPU核数的整数倍
日志模块是控制nginx如何记录请求的日志
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;
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default:
access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
缓冲区大小不能超过写入文件的最小大小
nginx用户必须有写入nginx日志文件的权限
推荐配置:
worker_processes 8 : 这里的8,推荐跟你的CPU核数相同
events {
use epoll;
worker_connections 1024; # 这里跟你操作系统能打开的文件句柄数相同, 可通过ulimit -n来查看
}
http配置主要分三个模块:
http {
# 这个是协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on
server {
# 这个是服务器级别,可以配置多个server
listen 80;
server_name localhost;
location ~* .~\.(jpg|jpeg|gif|png|swf|ico)$ {
if (-f $request_filename) {
break;
}
}
location / {
# 这个是请求级别
root html
index index.htm index.htm
}
}
}
Nginx的http核心魔,包括大量指令和变量。
Syntax: alias path;
Default: —
Context: location
Defines a replacement for the specified location. For example, with the following configuration
location /i/ {
alias /data/w3/images/;
}
nginx会把 /i/ 自动替换为 /data/w3/images/
也支持正则
Syntax: client_max_body_size size;
Default:
client_max_body_size 1m;
Context: http, server, location
Sets the maximum allowed size of the client request body. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.
Syntax: error_page code ... [=[response]] uri;
Default: —
Context: http, server, location, if in location
Defines the URI that will be shown for the specified errors. A uri value can contain variables.
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
如果出现404,则跳转到/404.html
指定server里可以被访问到的IP和端口地址,或可解析到的服务器的没名字。通常我们都只指定端口就可以。
Syntax: listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default:
listen *:80 | *:8000;
Context: server
open_file_cache max=1000 inactive=20s; #设置缓存的最大数据,过期时间
open_file_cache_valid 30s; # 有效时间
open_file_cache_min_uses 2; # 最少使用此时
open_file_cache_errors on; # 通常打开
这几个配置配合使用
Syntax: location [ = | ~ | ~* | ^~ ] uri {
... }
location @name {
... }
Default: —
Context: server, location
指定模式来与客户端请求的URI 相匹配。
1、没有修饰符,表示:必须从指定模式开始,如:
server {
server_name test.com
location /abc {
...
}
}
2、 = 表示:精确匹配,如:
server {
server_name test.com
location = /abc {
...
}
}
3、~ 表示:指定的正则表达式要区分大小写,如:
server {
server_name test.com
location ~ ^/abc {
...
}
}
下面是对的:
http://test.com/abc
http://test.com/abc?p1=1
下面是错的:
http://test.com/ABC
http://test.com/abc/
4、~* 表示:指定的正则表达式不区分大小写,如:
server {
server_name test.com
location ~* ^/abc {
...
}
}
下面是对的:
http://test.com/abc
http://test.com/abc?p1=1
http://test.com/ABC
下面是错的:
http://test.com/abc/
5、^~ 表示无修饰符的行为,也是从指定模式开始,不同的是,如果模式匹配,那么久停止搜索其他模式了
6、@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_file或error_page等
查找顺序和优先级:
1)带有 = 的精确匹配
2)没有修饰符的精确匹配
3)正则表达式安装他们在配置文件中定义的顺序
4)带有 ~ 修饰符的,开头匹配
5)带有 ~ 或 ~* 修饰符的
6)没有修饰符的,如指定字符串与URI开头匹配,如: location / {…}, 这样配置用来兜底,优先级最低
nginx通常用于后端服务器的反向代理,这样可方便的实现动静分离,以及负载均衡
http proxy模块,功能很多,最常用的时proxy_pass
http proxy模块,主要用于转发请求到其他服务器
location / {
proxy_pass http://localhost:8000; # 转发指令
proxy_set_header Host $host; # 设置header的值
proxy_set_header X-Real-IP $remote_addr; # 设置IP地址
}
Syntax: proxy_buffer_size size;
Default:
proxy_buffer_size 4k|8k;
Context: http, server, location
Syntax: proxy_buffering on | off;
Default:
proxy_buffering on;
Context: http, server, location
Syntax: proxy_buffers number size;
Default:
proxy_buffers 8 4k|8k;
Context: http, server, location
proxy_buffer_size: 设置从被代理服务器读取的第一部分应答的缓冲区大小
即从后端tomcat返回应答的缓冲区大小,默认是4k/8k
proxy_buffering:为后端服务器启用应答缓存
如果启用缓存,nginx假设被代理服务器能够非常快的传递应答,并将其放入缓冲区。可以使用proxy_buffer_size和proxy_buffers设置相关参数
proxy_buffers:设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况为分页大小,根据操作系统不同可能是4k或8k