nginx学习笔记
安装
mac os:1
brew install nginx
ubuntu:
1  | sudo apt-get install nginx  | 
启动
1  | nginx  | 
http://localhost 检测是否访问成功
1  | nginx -s stop // 强制停掉  | 
1  | ps -ef|grep nginx  | 
nginx进程在启动的时候,会附带一个守护进程,用于保护正式进程不被异常终止;如果守护进程一旦发现nginx进程被终止了,会自动重启该进程。
守护进程一般会称为master进程,业务进程被称为worker进程
nginx.conf
mac下的nginx.conf位置: /usr/local/etc/nginx/nginx.conf
可以命令搜索1
sudo find / -name nginx.conf
嫌麻烦打开,配置别名
1  | // .zshrc code是vscode命令快捷打开功能  | 
1  | ... #全局块  | 
默认root路径
1  | root html => /usr/local/Cellar/nginx/[version]/html  | 
规则
1  | server {  | 
我们访问http://xxx.com/proxy/index.html
case 1:1
2
3location /proxy/ {
    proxy_pass  http://127.0.0.1/;
}
case 2:1
2
3location /proxy/ {
    proxy_pass  http://127.0.0.1;
}
case 3:1
2
3location /proxy/ {
    proxy_pass  http://127.0.0.1/api/;
}
case 4:1
2
3location /proxy/ {
    proxy_pass  http://127.0.0.1/api;
}
看case 2 和 4是比较难理解的,为什么都是没有后面的/差别为什么这么大,个人理解,如果proxy_pass只是域名则只替换原地址域名,否则全部替换掉。
用到的文件路径
ng配置: nginx.conf => /usr/local/etc/nginx
访问日志: access.log => /usr/local/var/log/nginx
优先级
| 方式 | 意义 | 
|---|---|
| =PATH | 精确匹配路径 | 
| ^~PATH | 使用正则表达式匹配URI的前半段 | 
| ~PATH | 使用正则表达式匹配URI,区分大小写 | 
| ~*PATH | 使用正则表达式匹配URI,不区分大小写 | 
| PATH | 直接使用PATH匹配,表示在PATH路径下的资源 | 
1  | location = / { # 仅当URI为"/"时,使用A配置  | 
按上述定义,和优先级规则。比如:
“www.test.com/”匹配A配置;
“www.test.com/test”、”www.test.com/example”匹配B配置,因为URI都在”/”下;
“www.test.com/documents/test.html”匹配C配置,虽然它也符合B配置,但能匹配到的越长优先级越高;
“www.test.com/images/test.html”匹配D配置,虽然它也符合B配置,但正则表达式匹配前端字符优先级高;
“www.test.com/documents/test.jpg”匹配E配置,虽然它也符合C配置,但正则表达式匹配高于普通字符串。
配置https本地开发环境
在开发qtalk-web版本时遇到这样一个需求

实现谷歌推送消息,经过调研发现这个需要在https协议下,api才会生效,当时搜出的方法就是nginx,可是由于时间紧迫并没有时间研究,使用的比较快捷有效的方法,恰巧beta环境有https的支持,那我本地用charles劫持了js代码到本地,利用beta环境变成本地的调试环境。
我是通过这篇博客学习了https本地搭建
https://www.jianshu.com/p/fe0fadb38600
全局搜索配置文件:
1  | sudo find / -name nginx.conf  | 
证书及https配置
1  | cd /usr/local/etc/nginx # 进入希望生成证书和私钥的目录,这里我们选择nginx.conf所在目录  | 
配置 nginx.config1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  localhost;
        # ssl_certificate      cert.pem;
        # ssl_certificate_key  cert.key;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;
        # ssl_session_cache    shared:SSL:1m;
        # ssl_session_timeout  5m;
        # ssl_ciphers  HIGH:!aNULL:!MD5;
        # ssl_prefer_server_ciphers  on;
        location / {
            root   /www/;
            index  index.html index.htm;
        }
    }
那我这里想在我的项目里用到https协议,这样还不能满足,我需要更改下location
1  | location / {  | 
还是会报一个错误
1  | GET https://my.corp.qunar.com/index.js net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)  | 
google后发现是因为nginx会从缓存中拿文件,是这个目录proxy_temp,而没有权限,所以网上一些方法是1
chown -R _www:admin proxy_temp
不过更改文件夹权限我是莫名地抵触的,我选择了一个我认为还不错的方法1
2
3
4location / {
            proxy_pass http://my.corp.qunar.com:3002;
            proxy_buffering off;
        }
就是把缓存禁掉
总结
ng访问地址404 自己会根据优先级逐级查找,如果都404,则按照原地址访问。这样就有可能导致形成内循环,相互跳转,产生错误。