介绍
以下学习笔记来自于尚硅谷的Nginx课程
目录
前言
-
说明 Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。 该软件由伊戈尔·赛索耶夫(Игорь Сысоев)创建并于2004年首次公开发布。2011年成立同名公司以提供支持。 2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。
-
原理 多进程:一个 Master 进程、多个 Worker 进程 Master 进程:管理 Worker 进程 对外接口:接收外部的操作(信号) 对内转发:根据外部的操作的不同,通过信号管理 Worker 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程 Worker 进程:所有 Worker 进程都是平等的 实际处理:网络请求,由 Worker 进程处理; Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
- 常用命令
nginx -v #查看版本号 nginx #启动 nginx -s stop #关闭 nginx -s reload #重新加载
- 默认配置文件
-
nginx.conf
user nginx; worker_processes auto;#工作进程数 error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024;#最大连接数 } http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
-
conf.d/default.conf
server { listen 80; listen [::]:80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/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 /usr/share/nginx/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; #} }
location值令
精确匹配: = , 后面的表达式中写的是纯字符串 字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串 正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式 匹配顺序: = > ^~ > ~ > ~* > /
- =
# 精确匹配,必须是 servername/ location = / { ... } # 精确匹配,必须是127.0.0.1/login location = /login { ... }
2. ^~ ```properties ## 对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写 ## servername/static/js. location ^~ /static/ { ... } ```
- ~
##对 uri (可以不是起始字符)做 正则匹配,区分大小写 ## 区分大小写,以gif,jpg,js结尾 location ~ \.(gif|jpg|png|js|css)$ { ... }
- ~*
##对 uri (可以不是起始字符)做 正则匹配,不区分大小写 ## 不区分大小写,匹配.png结尾的 location ~* \.png$ { ... }
- !~ 和!~*
##分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配,可以用于错误页 ## 区分大小写,匹配不以.xhtml结尾的 location !~ \.xhtml$ { ... } location !~* \.xhtml$ { ... }
- /
## 什么都可以 location / { ... }
- @
##此种方式的location配置,无法通过外网访问,只能通过内网跳转,实现容错的功能 location @name { ... }
- ~
- =
-
Rewrite重定向&&Return重定向
last – 表示完成rewrite
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
1、下面是可以用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
2、下面是可以用作判断的全局变量
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php
- Rewrite
server { listen 80; server_name start.igrow.cn; root html; index index.html index.php; rewrite ^(.*) https://star.igrow.cn$1 permanent; }
- Return
server {
listen 80;
server_name start.igrow.cn;
return 301 https://$host$request_uri;
}
-
区别
rewrite 重定向:需要先做正则匹配,然后再给客户端返回新地址进行重定向(做了两步操作) return 重定向:不需要做正则匹配,直接给客户端返回新地址进行重定向(做了一步操作)
if
// 如果用户设备为IE浏览器的时候,重定向 。如果UA包含"MSIE",rewrite请求到/msid/目录下
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
//如果cookie匹配正则,设置变量$id等于正则引用部分
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
//如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
if ($request_method = POST) {
return 405;
}
//限速,$slow可以通过 set 指令设置
if ($slow) {
limit_rate 10k;
}
//如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
if (!-f $request_filename){
break;
proxy_pass http://127.0.0.1;
}
//如果query string中包含"post=140",永久重定向到example.com
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
}
//防盗链
//如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为true
//语法: valid_referers none | blocked | server_names | string ...;
//参数说明:
//none: 不允许 “Referer” 来源头部为空的情况
//blocked: 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除
//server_names: “Referer”来源头部包必须含当前的server_names (当前域名)可以多个
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.lfa.com;
if ($invalid_referer) {
return 404;
}
}
//根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
// 禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$request_method : 客户端请求的动作,通常为GET或POST。
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri : 不包含请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri : 与$uri相同。
$query_string
$args : 这个变量等于请求行中的参数,同$query_string
$document_root : 当前请求在root指令中指定的值。
$limit_rate : 这个变量可以限制连接速率。
$request_body_file
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
//例:
http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
反向代理
- 正向代理:代理服务的配置内容在客户端,比如http代理 socks5 vemss,代理端后置于客户端
- 反向代理:代理的配置在服务端,对用户透明,代理端前置于真实服务器
负载平衡器
upstream myserer{
server FuzaiUri:xx
server FuzaiUri:yy
}
location / {
proxy_pass http://myserver
}
- 策略
- 轮询(默认) 如果服务器down掉能自动切换
- weight 代表权重,默认为1
upstream myserer{ server FuzaiUri:xx weight 5 server FuzaiUri:yy weight 10 }
- ip_hash ip分配到hash slot
upstream myserer{ ip_hash server FuzaiUri:xx server FuzaiUri:yy }
- fair(第三方) 根据请求的响应时间分配 响应时间短优先分配
upstream myserer{ fair server FuzaiUri:xx server FuzaiUri:yy }
动静分离
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}