Nginx学习笔记

google关键词‘nginx’,随随便便都能找出下面这段解释:nginx是一款轻量级的网页服务器、反向代理服务器。它具有占有内存少,稳定性高等优势。它最常的用途是提供反向代理服务。总之就是好牛逼的感觉。

刚开始接触nginx不太清楚里面的配置的意思,所以结合自己的使用总结出下面这篇笔记。

介绍

先上图,了解一下nginx各方面的信息(请原谅我无耻的盗了一张图):

nginx基础介绍

具体nginx能干啥,巴拉巴拉。。。。。(此处省略15000字)

安装

下载地址,有你想要的各种版本:
http://nginx.org/en/download.html

运行

windows用户:

1
2
3
4
5
//解压文件后进去nginx目录
nginx.exe -t 测试配置文件是否正确
start nginx.exe 启动ng 或者直接双击nginx.exe
nginx.exe -s stop 停止ng
nginx.exe -s reload 重启ng

linux用户:

1
2
3
4
5
//解压文件后进去nginx目录
./nginx -t 测试配置文件是否正确
./nginx 启动ng
./nginx -s stop 停止ng
./nginx -s reload 重启ng

location配置规则

nginx通过匹配location的规则来决定请求该如何处理,因此需要先熟悉location的配置规则。

1
2
3
4
location / {
root html;
index index.html index.htm;
}

语法规则: location [=|~|~*|^~] /url/ { … }

  • = 开头表示精确匹配

  • ^~ 开头表示url以某个常规字符串开头。nginx不对url做编码,因此请求为/xxx/20%/aa,可以被规则^~ /xxx/ /aa匹配到(注意空格)。

  • ~ 开头表示区分大小写的正则匹配

  • ~* 开头表示不区分大小写的正则匹配

  • !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

  • / 通用匹配,任何请求都会匹配到。

具体内容看后面的Demo

全局变量

ng提供了下面这些全局变量,可以在if判断或者请求转发的时候用到

  • $args: #这个变量等于请求行中的参数,同$query_string

  • $content_length: 请求头中的Content-length字段。

  • $content_type: 请求头中的Content-Type字段。

  • $document_root: 当前请求在root指令中指定的值。

  • $host: 请求主机头字段,否则为服务器名称。

  • $http_user_agent: 客户端agent信息

  • $http_cookie: 客户端cookie信息

  • $limit_rate: 这个变量可以限制连接速率。

  • $request_method: 客户端请求的动作,通常为GET或POST。

  • $remote_addr: 客户端的IP地址。

  • $remote_port: 客户端的端口。

  • $remote_user: 已经经过Auth Basic Module验证的用户名。

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

  • $scheme: HTTP方法(如http,https)。

  • $server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

  • $server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。

  • $server_name: 服务器名称。

  • $server_port: 请求到达服务器的端口号。

  • $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

  • $uri: 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

  • $document_uri: 与$uri相同。

简单示例-转发

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#配置服务器列表 常用指令
upstream local_xhay1122 {
server 127.0.0.1:9999;
}
upstream online_xhay1122 {
# 保证用户当前用户的请求一直在某一台服务器上
ip_hash;
# weight服务器的权重
server 192.168.0.45:8000 weight=5;
# down表示服务器永久离线
server 192.168.0.46:8000 down;
}
server{
# 监听80端口
listen 80;
# 使用test.xhay1122.com域名访问
server_name test.xhay1122.com;
# 资源过期时间,本地调试设置为不缓存-1,服务器使用可以把静态资源缓存时间设置长一点儿
expires -1;
# 设置变量供后面使用
set $testhost "local_xhay1122";
# 根据$request_uri 或者 $uri等参数做一些事情
#if ($uri ~ ".(do)$" ) {
# # 。。。
#}
# 精确匹配
# test.xhay1122.com/才能通过
location = / {
proxy_pass $scheme://$testhost$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# url中包含demoxxxx的请求,执行下面的规则
# test.xhay1122.com/demoxxxx/xxx 通过
# test.xhay1122.com/image/xxx.png 不通过
location /demoxxxx/ {
proxy_pass $scheme://$testhost$request_uri;
proxy_set_header Host $testhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
}
# 不区分大小写,拦截png|gif格式的图片
# test.xhay1122.com/image/xxx.png 通过
location ~* .(png|gif)$ {
# 注意这里会把请求转到线上online_xhay1122
proxy_pass $scheme://online_xhay1122$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 如果请求在上面几种情况都无法满足, / 可以转发所有请求
location / {
proxy_pass $scheme://$testhost$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

配置nginx虚拟主机

居然差点忘了说一说虚拟主机的配置方法了。。。。

nginx虚拟主机允许我们在同一台服务器上运行多个网站,可以给不同的域名绑定不同的目录,访问这个域名的时候,会打开对应目录里面的东西

  • 找到nginx的配置文件nginx.conf

  • 文件里面有一段 server {...},我们可以把他替换成include vhost/*.conf,导出vhost目录下面以conf结尾的配置文件;

  • 创建vhost文件,然后添加多个*.conf的配置文件。

  • 配置文件内容,其他配置一样,不同的是server部分:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
# 指定域名
server_name xxx.xhay1122.com;
location / {
# 指定需要访问的目录
root /usr/share/nginx/blog;
index index.html index.htm;
}
}

写在最后

有新发现后在更新

完了。。。