Nginx
Posted 小企鹅推雪球!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx相关的知识,希望对你有一定的参考价值。
server 配置块
- 在 nginx 中,一个 server 配置块代表了一个虚拟机主机。
虚拟主机
- 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成多台 “虚拟” 的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的 Internet 服务器功能(WWW、FTP、Email 等等),同一台主机上的虚拟主机之间是完全独立的。
- 从网站访问者来看,每一台虚拟主机和一台独立主机完全一样。
- 利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx 服务器或单独运行一组 Nginx 进程。虚拟主机提供了在同一台服务器、同一组 Nginx 进程上运行多个网站的功能。
Nginx 配置虚拟主机
-
在 Nginx 配置文件(nginx.conf)中,最简化的虚拟主机配置如下:
#user nobody; worker_processes 3; events #... http #... server listen 8080; server_name localhost; access_log logs/host.access.log main; location / root html; index index.html index.htm; #...
-
server 配置块配置了一个监听 8080 端口的虚拟主机
-
Nginx 通过 listen 指令指定的值监听网络请求,可以是 IP 协议的形式,也可以是 UNIX 域套接字。
-
如果不设置 listen 指令,Nginx 在以超级用户运行时则监听 80 端口,以非超级用户运行时则监听 8000 端口
-
listen用法示例
http server listen 127.0.0.1:8000; # 监听127.0.0.1的8000端口 listen 127.0.0.1; # 监听127.0.0.1的默认80端口(root权限) listen 8000; # 监听本机所有IP的8000端口 listen *:8000; # 监听本机所有IP的8000端口 listen localhost:8000; # 监听locahost的8000端口 listen [::]:8000; # 监听IPv6的8000端口 listen [::1]; # 监听IPv6的回环IP的默认80端口(root权限) listen unix:/var/run/nginx.sock; # 监听域套接字文件 listen *:8000 \\ # 监听本机的8000端口 default_server \\ # 当前服务是http指令域的主服务 fastopen=30 \\ # 开启fastopen功能并限定最大队列数为30 deferred \\ # 拒绝空数据连接 reuseport \\ # 工作进程共享socket这个监听端口 backlog=1024 \\ # 请求阻塞时挂起队列数是1024个 so_keepalive=on; # 当socket为保持连接时,开启状态检测功能
-
server_name 指令
主要用于配置基于名称的虚拟主机- server_name 指令在接到客户请求后的匹配顺序分别为
- 准确的 server_name 匹配
server listen 80; server_name domain.com www.domain.com; ...
- 以 * 通配符开始的字符串:
server listen 80; server_name *.domain.com; ...
- 以 * 通配符结束的字符串:
server listen 80; server_name www.*; ...
- 匹配正则表达式
server listen 80; server_name ~^(?.+)\\.domain\\.com$; ...
- 准确的 server_name 匹配
- Nginx 将按照上面1、2、3、4顺序对 server_name 进行匹配,只要有一项匹配 server_name 后就会停止继续匹配。
- server_name 指令在接到客户请求后的匹配顺序分别为
-
access_log指令
用来指定日志文件的存放路径、格式(把定义的 log_format 跟在后面)和缓存大小;如果不想启用日志则access_log off
; -
location指令
的作用是根据用户请求的 URI 来执行不同的操作,也就是根据用户请求的网站 URL 匹配 location 配置块,匹配成功就执行 location 配置块中定义的相关操作#user nobody; worker_processes 1; http #... server listen 8080; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / root html; index index.html index.htm; location ~ \\.php$ proxy_pass http://127.0.0.1; location ~ \\.php$ root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; #...
location 配置块
-
location 配置块用来配置匹配的不同请求 URL 的处理方式
http #... server listen 8080; #... location / root html; index index.html index.htm; location /example1 // 匹配请求 URL 为 /example1 的请求 // 在这里为该请求定义配置信息 location /example2 proxy_pass http://localhost:8080/demo/mng/; proxy_cookie_path /demo /; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect ~^http://localhost:8080/demo/mng/(.*) https://www.demo.com/mng/$1; proxy_connect_timeout 4s; proxy_read_timeout 60s; proxy_send_timeout 8s; #...
-
location 配置块只能在 server 配置块中配置
-
location 指令的功能是用来匹配不同的 URI 请求,进而对请求做不同的处理和响应
-
location 指令匹配 URI 类型,有四种参数可选,例如
location [ = | ~ | ~* | ^~ ] /URI # ...
-
空
:location 后没有参数直接跟着标准 URI,表示前缀匹配,代表跟请求中的 URI 从头开始匹配
7.=
:用于标准 URI 前,要求请求字符串与其精准匹配,成功则立即处理,nginx 停止搜索其他匹配 -
^~
:用于标准URI前,并要求一旦匹配到就会立即处理,不再去匹配其他的那些个正则 URI,一般用来匹配目录 -
~
:用于正则 URI 前,表示 URI 包含正则表达式,区分大小写 -
~*
:用于正则 URI 前,表示 URI 包含正则表达式,不区分大小写 -
@
用来定义一个命名location。主要用于内部重定向,不能用来处理正常的请求location @/name/ # ...
-
@ 定义一个命名的 location,@ 定义的 location 名字一般用在内部定向例如:error_page、try_files
location / try_files $uri $uri/ @custom location @custom # ...do something
-
当尝试访问 url 找不到对应的文件就重定向到我们自定义的命名 location(此处为 custom),命名 location 中不能再嵌套其它的命名 location。
-
Nginx URL匹配顺序
-
nginx 用两层指令匹配请求URL,
-
第一层匹配:使用server指令,通过域名,ip和端口来做第一层匹配,当找到匹配的 server 后就进入此 server 的 location 匹配。
-
第二层:location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求 URI 会按如下规则进行匹配:
- 先精准匹配 = , 精准匹配成功则会立即停止其他类型的匹配
- 没有精准匹配成功时,进行前缀匹配。先查找带有 ^~ 的前缀匹配,带有 ^~ 的前缀匹配成功则立即停止其他类型匹配
- 前缀匹配未成功,再进行普通前缀匹配(不带参数 ^~ )成功则会暂存,继续查找正则匹配
- = 和 ^~ 均未匹配成功前提下,查找正则匹配 ~ 和 ~* 。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配
- 所有正则匹配均未成功时,返回步骤(2)中暂存的普通前缀匹配(不带参数 ^~ )结果;
-
匹配规则优先级从高到低依次
location = # 精准匹配,优先级最高 location ^~ # 带参前缀匹配 location ~ # 正则匹配(区分大小写) location ~* # 正则匹配(不区分大小写) location /a # 普通前缀匹配,优先级低于带参数前缀匹配。 location / # 任何没有匹配成功的,都会匹配这里处理,优先级最低
Nginx URL匹配顺序样例
location = /
# 配置A
location /
# 配置B
location /user/
# 配置C
location ^~ /images/
# 配置D
location ~* \\.(gif|jpg|jpeg|png)$
# 配置E
- 请求 / 精准匹配 A,不再往下查找
- 请求 /index.html 匹配 B。首先查找匹配的前缀字符,找到最长匹配是配置 B,接着又按照顺序查找匹配的正则。结果没有找到,因此使用先前标记的最长匹配,即配置 B。
- 请求 /user/index.html 匹配 C。首先找到最长匹配 C,由于后面没有匹配的正则,所以使用最长匹配C。
- 请求 /user/1.jpg 匹配 E。首先进行前缀字符的查找,找到最长匹配项 C,继续进行正则查找,找到匹配项 E,因此使用 E。
- 请求 /images/1.jpg 匹配 D。首先进行前缀字符的查找,找到最长匹配 D。但是,特殊的是它使用了 ^~ 修饰符,不再进行接下来的正则的匹配查找
- 请求 /documents/about.html 匹配 B。因为 B 表示任何以 / 开头的 URL 都匹配。在上面的配置中,只有B能满足,所以匹配 B。
location配置块指令
-
·
proxy_pass指令
用于设置代理服务器的映射地址,映射地址可以使用http或者https协议,映射地址可以使用域名,IP,以及可选的端口号例如: proxy_pass http://localhost:8080/demo/mng/; proxy_cookie_path;proxy_cookie_path path replacement; 在单词 “unix” 之后指定并用冒号括起来的 UNIX 域套接字路径: proxy_pass http://unix:/tmp/backend.socket:/uri/;
-
proxy_cookie_path指令用于改变cookie的路径
语法 proxy_cookie_path path replacement; path:是要替换的路径 replacement:就是要替换的值 样例 location /example2 proxy_pass http://localhost:8080/demo/mng/; proxy_cookie_path /demo /;
-
proxy_connect_timeout
指令定义与代理服务器建立连接的超时时间,注意:这个超时时间通常不能超过 75 秒
以上是关于Nginx的主要内容,如果未能解决你的问题,请参考以下文章