跨域配置、https配置

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。

目录

概 述

  1. location正则写法

location
以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。
以^~ 开头,表示uri以某个常规字符串开头,如果匹配到,则不继续往下匹配。不是正则匹配
以~ 开头,表示区分大小写的正则匹配;
以~* 开头,表示不区分大小写的正则匹配
以/ 开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到
*注意 location xxx {} 其中xxx与括号之间很多时候需要空格,最好都加上

匹配顺序:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)

rewrite
rewrite只能放在 server{}, location{}, if{}中,并且只能对域名后的文件路径起作用。

执行顺序
执行server块的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
语法
rewrite regex replacement [flag];

flag
这儿分为server级和location级,其中if可写在server和location中,分别对应server级和location级。同级别中执行顺序看书写顺序。
last : 不再执行同级rewrite,写在location中重新循环匹配location.
break : 不再执行同级rewrite,只往后继续执行,不重新匹配location。
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
当不写flag时,再次循环同级匹配

if(condition)
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
直接比较变量和内容时,使用=或!=
~ 正则表达式匹配
~* 不区分大小写的匹配
!~ 区分大小写的不匹配
-f和!-f 用来判断是否存在文件
-d和!-d 用来判断是否存在目录
-e和!-e 用来判断是否存在文件或目录
-x和!-x 用来判断文件是否可执行

其他
调试
default_type application/json;
在locaiton中 return 200 ‘$uri xxx’
变量
set a " 1 " i f ( a "1" if ( a"1"if(a = “1”) {
return 302
}
proxy_pass
proxy_pass http://127.0.0.1:8008/;
这里只讨论在location中的proxy_pass;

1、 location 使用非正则匹配

location /api {

1. proxy_pass http://127.0.0.1:8008/a;

2. proxy_pass http://127.0.0.1:8008;

}
1中 端口后面有"/" ,访问/api/test → /a/test;(匹配剩余的地址为/test,再将地址拼接到代理地址中)
2中 端口后面没有"/" ,访问/api/test → /api/test
此处要注意,并不是uri最后是否有"/",是端口后面是否有"/"

2、location 使用正则匹配

location ~ /api/ {
proxy_pass http://127.0.0.1:8008;
}
端口后面不加/,可行。
端口后面加/,则必须使用变量(任何变量都行,让其使用第3条规则)。因为代理地址会自动加上匹配剩余的uri,代理去正则匹配剩余的uri会使地址乱套。
3、如果proxy_pass后面有变量,直接去的那个地址,跳出1 2条规则。

举例
server {
listen 80;
rewrite /a(.) /b$1;
rewrite /b(.
) /c$1 last;
rewrite /c(.) /dKaTeX parse error: Expected '}', got 'EOF' at end of input: …on / { if (uri ~ /d/) {
rewrite /d/(.
) /api/KaTeX parse error: Expected 'EOF', got '}' at position 13: 1 last; }̲ return 200…uri’;
}
location /api {
proxy_pass http://127.0.0.1:8000/test; #端口号后面有/,代理删掉/api。
}
location ~ /t/(.*)/t {
proxy_pass http://127.0.0.1:8000/test1/$1;
#proxy_pass http://127.0.0.1:8000/test1; 写法报错,必须使用变量,使用第3条代理规则。
}
}
访问/test 返回 /test
访问/aaa 返回 /caa
访问/api 返回 /cpi
访问/d/dd 代理去 http://127.0.0.1:8000/test/dd
访问/ee/t/test2/t/every 代理去 http://127.0.0.1:8000/test1/test2

nginx 的进程模型采用的是prefork方式,预先分配的worker子进程数量由配置文件指定,默认为1。master主进程创建监听套接口,fork子进程以后,由worker进程监听客户连接,每个worker子进程独自尝试accept已连接套接口,accept是否上锁可以配置,默认会上锁,如果操作系统支持原子整型,才会使用共享内存实现原子上锁,否则使用文件上锁。如果不使用锁,当多个进程同时accept,当一个连接来的时候多个进程同时被唤起,会导致惊群问题。使用锁的时候,只会有一个worker阻塞在accept上,其他的进程则会不能获取锁而阻塞,这样就解决了惊群的问题。master进程通过socketpair向worker子进程发送命令,终端也可以向master发送各种命令,子进程通过发送信号给master进程的方式与其通信,worker之间通过unix套接口通信。

当master接收到worker发回的SIGCHLD信号时,(worker进程的退出信号),它会逐个检查每一个worker进程,如果发现有worker进程是异常退出,就会重新启动这个worker进程。另外nginx还有两个用于管理cache的进程,一个是cache manager process,另外一个是cache loader process,它们是专门服务于文件cache的进程,也服从master进程的管理,类似于worker进程,后面的分析将略去它们。下面从代码的角度,详细分析实现细节。

master启动的时候,有一些重要的全局数据会被设置,最重要的是进程表ngx_processes,master每创建一个worker都会把一个设置好的ngx_process_t结构变量放入ngx_processes中,新创建的进程存放在ngx_process_slot位置,ngx_last_process是进程表中最后一个存量进程的下一个位置,ngx_process_t是进程在nginx中的抽象:

复制代码
1 typedef struct {
2 ngx_pid_t pid; //进程的ID
3 int status; //进程的退出状态
4 ngx_socket_t channel[2]; //用于socketpair通信的一对socket句柄
5 ngx_spawn_proc_pt proc; //进程的执行函数
6 void *data; //proc的参数
7 char *name; //进程的title标识
8 unsigned respawn:1; //进程的状态:重新创建的
9 unsigned just_spawn:1; //进程的状态: 第一次创建的
10 unsigned detached:1; //进程的状态: 分离的,独立的
11 unsigned exiting:1; //进程的状态: 正在退出的
12 unsigned exited:1; //进程的状态: 已经退出的
13 } ngx_process_t;(src/os/unix/ngx_process.h)
复制代码
master进程向worker子进程发送命令是通过socketpair创建的一对socket实现的,之间传输的是ngx_channel_t结构变量:

复制代码
1 typedef struct {
2 ngx_uint_t command; //发送的命令
3 ngx_pid_t pid; //发送方进程的进程id
4 ngx_int_t slot; //发送方进程在进程表中偏移位置
5 ngx_fd_t fd; //发送给对方的文件句柄
6 } ngx_channel_t;(src/os/unix/ngx_channel.h)
复制代码
command是要发送的命令,有5种:

1 #define NGX_CMD_OPEN_CHANNEL 1
2 #define NGX_CMD_CLOSE_CHANNEL 2
3 #define NGX_CMD_QUIT 3
4 #define NGX_CMD_TERMINATE 4
5 #define NGX_CMD_REOPEN 5

1).首先分析master进程的代码的功能,(Ngx_process_cycle.c中):

main()函数首先做一系列的初始化工作调用各模块的初始化代码(例如创建监听套接口等)然后就会调用ngx_master_process_cycle代码(多进程启动情况下),cycle是一个全局结构体变量,存储有系统运行的所需要的一些信息。在分析进程关系的的时候可以先忽略它。

小结

参考资料和推荐阅读

1.链接: 参考资料.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值