总述
Nginx 的配置文件是采用模块化的设计的,包括多个上下文 ,主要的上下文有:main、events、http、server、location
mian: 全局配置,如设置错误日志路径和日志级别:error_log /var/log/nginx/error.log warn;
event: 事件上下文,影响nginx的并发处理能力
指定每个工作进程的最大并发连接数:worker_connections 1024;
http: include: 包含其它配置文件
sendfile on; : 启用sendfile系统调用,提高静态文件传输效率
keepalive_timeout 65; 指定长连接的超长时间
gzip on; 启用gzip压缩,减少传输数据量
server: 定义虚拟主机(可多个),每个虚拟主机可以独立配置不同的域名、端口、目录
listen: 指定监听的端口和地址
server_name: 指定虚拟主机的主机名 server_name a;
root: 指定虚拟主机的根目录
index: 指定默认的索引文件 index index.html index.htm;
error_page: 指定错误页面的路径 error_page 404 / 404.html;
location: 匹配URL路径 支持多种匹配方式,前缀匹配,正则匹配等
proxy_pass 将请求转发到后端服务器
rewrite: 重写url路径
NGINX转发(http)
location
请求送到nginx 后,先根据location 后的url 与请求进行匹配,只有匹配上的才会执行这个location中的语句
匹配规则(匹配模式)
精确匹配
全路径精确匹配
location = /index 只有/index才会被匹配到,别的任何路径都不会被匹配。
前缀匹配
前缀模糊匹配(也是前缀匹配)
location ^~ /user/ ,只要是以/user/开头的都会被匹配到。如: /user/t,而使用^~ 是为了保证其匹配优先级要高于其它前缀匹配。
普通前缀匹配
location /api/ {} 匹配所有以/api/开头的路径,如/api/user,但是其不会匹配 /api,
location /api {} 则会匹配以/api开头的所有路径,如/api/user,不会匹配/apihi
lcoation /api/abc 则会匹配到 /api/abcd,也会匹配到 /api/abc/
正则匹配
正则匹配是使用~ 或~* 来定义正则匹配的location ,其优先级是低于精确匹配和前缀匹配的。
匹配优先级
前缀匹配优先级:
- 优先级 全路径精确匹配>前缀模糊匹配>普通前缀匹配>正则匹配
- 普通前缀匹配(非正则):Nginx 会首先尝试根据前缀来匹配请求的路径,优先匹配“最精确”的前缀。路径越长,越具体的前缀,优先级越高。
- 精确匹配优先:对于前缀匹配,Nginx会选择匹配路径最精确的。
如,如果有两个location location /api/ location /api 请求/api/user 会优先匹配第一个。第一个更长更精确。
proxy_pass
将请求转发向后端服务器
使用方法:proxy_pass url;
这个url的尾部带不带/ 以及location 中带不带/ 对最终转发的路径有很大的影响。
举例
location 匹配路径末尾有/
proxy_pass 后面的路径只有域名,没有/
访问路径: /app/user/index.html
location /app/{
proxy_pass http://localhost:8080;
}
最终请求会被代理到:http://localhost:8080/app/user/index.html
proxy_pass 后面的路径只有域名,有/
location /app/{
proxy_pass http://localhost:8080/;
}
最终请求会被代理到:http://localhost:8080/user/index.html
proxy_pass 后面的路径有域名,还有其它路径,且没有/
location /app/{
proxy_pass http://localhost:8080/abc;
}
最终请求被代理到:http://localhost:8080/abcuser/index.html
proxy_pass 后面的路径有域名,还有其它路径,有/
location /app/{
proxy_pass http://localhost:8080/abc/;
}
最终请求被代理到:http://localhost:8080/abc/user/index.html
只要我端口号后有/都会将匹配的路径进行消除,只要端口号后无/则会将匹配的路径带上。
如果proxy_pass的端口号后带有/,则匹配的部分会被去掉
请求:/app/user/index.html,匹配的部分是/app/ 剩下的是user/index.html,然后将这个拼接到proxy_pass后面。
如果proxy_pass的端口号后未带有/,则匹配的部分会被保留
请求:/app/user/index.html,匹配的部分是/app/ 因为不带斜杠,剩下的是/app/user/index.html,直接加到url后,最终的转发地址是:http://localhost:8080/app/user/index.html
location 匹配路径末尾没有/
也是根据端口后有没有/来处理,如果有,则消除,如果无,则原来的带过来。
location /app{
proxy_pass http://localhost:8080/abc/;
}
请求/app/user/index.html,最后有/ 则消除,成为:/user/index.html,;拼接后是: http://localhost:8080/abc//user/index.html Nginx会自动消除路径中多的/,所以最终会转发到:http://localhost:8080/abc/user/index.html。http:后面的//不是路径的部分,所以不会被Nginx消掉。
NGINX转发(非http/stream)
stream块用来转发非http请求
stream{
upstream{} 块
server{
listen
proxy_pass
}
}
里面的upstream块 和server块,这个里面是没有location的,通过server里的proxy_pass来定义转发到哪个url。upstream 也是用来负载均衡的。listen 是监听的端口
upstream 实现负载均衡
如:
http {
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
此时 请求需要是http://example.com这种,即请求中是带有server_name的。会被转发到upstream中定义的那几个sever中。
server_name 也可以是ip ;也可以直接不使用server_name 这一个字段。
upstream 中的 server 只能是域名或者(IP+端口),其后不能够加斜杠,也不能够跟路径。而斜杠以及路径这些依旧是在proxy_pass进行的处理。
upstream backend_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://backend_servers/api/; # 可以在这里定义路径
}
}
如:请求是Http://example.com/api/user/123
则会送到: http://192.168.1.10:8080/api/user/123
或者 http://192.168.1.11:8080/api/user/123
白名单配置
可以在nginx的配置文件外定义一个白名单或者黑名单配置文件:whitelist.conf 或者blacklist.conf
白名单示例:
allow 192.168.1.100;
allow 192.168.1.101;
allow 192.168.1.0/24;
deny all; //只通过允许的,拒绝所有其它的IP。这个必须要有
黑名单示例:
deny 192.168.1.100;
deny 192.168.1.101;
allow all; //允许所有其它IP,拒绝列出的几个IP,这个必须有
然后在location块中 或者server块中引入这个名单即可。在location块中,只会限制匹配到的路径,而加在server块中的话,这个server虚拟服务器都将限制这些IP。
http {
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
include /etc/nginx/blacklist.conf //include+文件所在路径+文件名
location / {
include /etc/nginx/blacklist.conf /这也是可以的,匹配到的路径会限制这些ip
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
还可以有更多的限制,限制server一共能有多少个连接,限制一个IP能够创建几个连接,限制一个IP能够最大多大的下载速度,限制连接时间,这都是可以的。
1683

被折叠的 条评论
为什么被折叠?



