文章目录
1 配置文件的结构
nginx及其模块的工作方式在配置文件中确定。 默认情况下,配置文件名为
nginx.conf
并放在目录中/usr/local/nginx/conf
,/etc/nginx
,或者/usr/local/etc/nginx
。
nginx由模块(module)组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令两种。
1.1 简单指令
简单指令以空格分隔,以分号结尾。
格式:<指令名称> <指令参数>;
示例:worker_processes 1;
1.2 块指令
块指令与简单指令具有相同的结构,但是它以一组附加指令结束(用括号括起来),而不是分号。
块指令允许嵌套!
格式:
<指令名称> {
<附加简单指令1> <参数1>;
<附加简单指令2> <参数1>;
<附加块指令1> {
<附加简单指令1.1> <参数1.1>;
<附加简单指令1.2> <参数1.2>;
}
}
示例:
server {
listen 8000;
listen somename:8080;
server_name somename alias another.alias;
location / {
root html;
index index.html index.htm;
}
}
1.3 上下文
如果一个块指令在大括号内包含其他指令, 则它被称为上下文。
如果一个指令没有包含在任何明确定义的上下文中,则其被包含在main
上下文中。
比如在下面的配置示例中,上下文关系为:main > http > server > location > root
:
http
指令在main
上下文中
server
指令在http
上下文中
location
指令在server
上下文中
以此类推
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}
1.4 注释
#
符号之后的其余部分被视为注释。
例如:
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
2 静态资源服务器实例
2.1 需求概述
本实例中我们将nginx
用作静态资源服务器。
假设我们的需求为:
- 当访问
/xxx
时,返回服务器上/root/data/xxx
文件 - 当访问
/images/xxx.yyy
时,返回服务器上/root/images/xxx.yyy
文件
2.2 配置示例
操作过程:
- 首先我们上传部分文件到服务器(过程略):
- 修改nginx配置,将
nginx.conf
修改为如下内容user root; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { location / { root /root/data/; } location /images/ { root /root/data/; } } }
- 重启nginx。
./nginx -s reload
- 测试
2.3 配置解释
server {
location / {
root /root/data/;
}
location /images/ {
root /root/data/;
}
}
- server
- 通常情况下,一个配置文件中可能指定多个server块,通过其监听的端口和服务名称区分。
- location
- 一旦nginx决定了使用哪个server来处理请求,就会使用请求url和location指定的路径来执行匹配。
- 如果一个url匹配了多个location路径,则会选择最长的location路径。例如
/images/gin.png
同时匹配location路径/
和/images/
,结果会使用location /images/
。
- root
- root指定了当前location块静态资源的根目录。例如访问
/xxx/yyy
路径时,将返回<root>/xxx/yy
的静态资源。
- root指定了当前location块静态资源的根目录。例如访问
3 代理服务器实例
3.1 需求概述
nginx的另一个常见用途是作为代理服务器,接收客户端请求,将其传递给指定的服务器,并将服务器的响应发送到客户端。
假设需求为:
- 服务器上有一个Web服务,监听8000端口。其中有一个接口
/go/hello
,返回固定的应答Hello Golang!
。 - nginx反向代理该服务,将所有
/go/
的请求交由该服务处理。
3.2 配置示例
- 写一个go语言的Web服务,监听8000端口,并开发好
/go/hello
接口。func main() { http.HandleFunc("/go/hello", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("Hello Golang!")) }) if err := http.ListenAndServe(":8000", nil); err != nil { log.Fatalf("http server shut down, err: %v", err) } }
- 将该web服务打包成linux的可执行文件。
# 设置环境为linux set CGO_ENABLED=0 set GOOS=linux set GOARCH=amd64 # 打包可执行文件 go build .
- 将该可执行文件上传到服务器
/opt/go-web/
目录下并启动。# 跳转到可执行文件的目录 cd /opt/go-web # 授予权限 chmod 777 go-web # 后台启动 nohup ./go-web >> ./go-web.log 2>&1 &
- 修改nginx配置,反向代理go服务。
修改nginx配置,将nginx.conf
修改为如下内容user root; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { location /go/ { proxy_pass http://localhost:8000/go/; } location /images/ { root /root/data/; } } }
- 重启nginx。
./nginx -s reload
- 测试
-
访问
<ip>/go/hello
-
访问
<ip>/images/gin.png
-
3.3 配置解释
上面示例中,反向代理的核心配置为:
server {
location /go/ {
proxy_pass http://localhost:8000/go/;
}
location /images/ {
root /root/data/;
}
}
- proxy_pass指令用于指定其代理的服务器的URL(协议、IP、端口、路径)