我的GitHub
0%

无星的nginx配置学习(一)-基础配置

背景

有个静态项目需要本地跑起来调试。这个项目还是前后端不分离的。

接口有发布好的开发环境。不想跑java,想直接跑前端调试。

所以用nginx

nginx安装

我是mac,brew是什么就不多说了。

1
2
3
4
# 安装
brew install nginx
# 查看信息
brew info nginx

打开配置文件nginx.conf

brew info命令会输出conf的地址,请仔细查看。

不要怕改错,同文件夹下有个default,随时可以用默认配置覆盖

1.png

默认配置长下面这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

worker_processes 1;
events {
worker_connections 1024;
}


http {
include mime.types;
default_type applocation/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include servers/*;
}

我们需要往里面加一个配置指向本地,新增一个server对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
server {
listen 7788;
server_name localhost;

location /a {
# root /Users/xing.wu/Desktop;
alias /Users/xing.wu/Desktop;
index index.html index.htm;
# 如果不是本地文件就转发
if (!-e $request_filename){
proxy_pass http://www.baidu.com;
}
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
}
# ......
}

1.server

需要新增一个配置,实际上就是看需要增到哪了。

因为我暂时没有了解location的生效顺序规则,保险起见,我新建一个server对象

2.listen

监听的端口,也是响应的端口

3.server_name

主机名

4.location

如表面词意,位置。支持正则。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置
listen 7788;
server_name localhost;
# 1.
location /a{}

http://localhost:7788/a 会被nginx响应

# 2.
location /b{}

http://localhost:7788/b 会被nginx响应

# 3.
location /{}

http://localhost:7788/ 会被nginx响应

// TODO:补全此知识点,location的生效规则

因为我暂时没有了解location的生效顺序规则,所以我不会去写/这个规则。或许以后我会来补全这个知识点。

4.1 root

1
2
3
location /b{
root /Users/xing.wu/Desktop;
}

意思是当前server+port指向root

换句话说

1
2
3
4
5
6
# 输入:
http://localhost:7788/b

#会被指向本地的文件夹:
#输出:
/Users/xing.wu/Desktop/b

4.2 alias

1
2
3
location /b{
alias /Users/xing.wu/Desktop;
}

别名,意思是server+port+location地址 = alias的地址

换句话说

1
2
3
4
5
6
7
8
#输入:
http://localhost:7788/b

#会被指向本地的文件夹:
#输出:
/Users/xing.wu/Desktop/

# 注意没,本地路径后面没有b了

4.3 index index.html index.htm;

1
2
3
4
location /b{
alias /Users/xing.wu/Desktop;
index index.html index.htm;
}

意思是默认加载这些文件

1
2
3
4
5
# 1.查找本地/Users/xing.wu/Desktop/文件夹下是否存在index index.html index.htm;
# 2.访问路径
http://localhost:7788/b
# 3.重定向到路径上
http://localhost:7788/b/index.html

4.4 判断

正常情况下,本地开发,前端文件当然得是本地的,只有接口请求才会要求转发

1
2
3
4
5
6
7
8
location /b{
alias /Users/xing.wu/Desktop;
index index.html index.htm;
# 如果不是本地文件
if (!-e $request_filename){
xxx
}
}

$request_filename
当前连接请求的文件路径,由root或alias指令与URI请求生成。

-e表示只要filename存在,则为真,不管filename是什么类型,当然这里加了!就取反

1
2
3
4
5
6
7
8
9
10
额外的一些:
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真

因此,上面的判断其实就是:如果请求的东西不是本地文件,进入if判断中

4.5 proxy_pass

转发的意思。结合之前的判断

1
2
3
4
5
6
7
8
location /b{
alias /Users/xing.wu/Desktop;
index index.html index.htm;
if (!-e $request_filename){
proxy_pass http://www.baidu.com;
break;
}
}

可以理解为,文件读本地的,接口转发到对应接口地址

1
2
3
4
5
6
7
8
9
# 输入(后缀带文件)
http://localhost:7788/b/index.html
# 输出
/Users/xing.wu/Desktop/index.html

# 输入(接口请求,没有后缀)
http://localhost:7788/b/getVersion
# 输出
http://www.baidu.com/getVersion

4.6 add_header

就是添加header,我这里添加这段的意思是,本地文件之类的不用缓存。

不添加的话,本地文件改了,浏览器刷新,还是走缓存,不会响应最新的修改。需要强刷才行。

添加以后,普通刷新就可以看到修改了。

1
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";

附赠一个小知识,如何强刷:

(1)打开浏览器

(2)打开控制台(F12),必须打开。

(3)把鼠标放到刷新按钮上,右键,注意是右键!!!

(4)选择:清空缓存并硬性重加载

2.png

nginx常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 启动
# nginx路径 -c 配置文件路径
# 例如:
nginx -c /usr/local/etc/nginx/nginx.conf

# 停止
nginx -s stop

# 退出
nginx -s quit

# 重启
nginx -s reload

如果使用brew,可以交给brew services托管命令

1
2
3
4
5
6
# 启动
brew services start nginx
# 停止
brew services stop nginx
# 重启
brew services restart nginx

参考

nginx内置变量