阅读之前,建议先阅读初识 Nginx。 之后,我们来了解一下 Nginx 配置。

抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和如何处理这些URLS 对应的请求。具体来说,就是定义一些虚拟服务器(Virtual Servers),控制具有特定 IP 和域名的请求。
更具体的来说, Nginx 通过定义一系列 locations 来控制对 URIS 的选择。每一个 location 定义了对映射到自己的请求的处理场景:返回一个文件或者代理请求,或者根据不同的错误代码返回不同的错误页面。另外,根据 URI 的不同,请求也可以被重定向到其它 server 或者 location 。
设置虚拟服务器
listen:
Nginx 配置文件至少包含一个 server 命令 ,用来定义虚拟服务器。当请求到来时, Nginx 会首先选择一个虚拟服务器来处理该请求。
虚拟服务器定义在 http 上下文中的 server 中:
http {
server {
# Server configuration
}
}
注意: http 中可以定义多个 server
server 配置块使用 listen 命令监听本机 IP 和端口号(包括 Unix domain socket and path),支持 IPv4、IPv6,IPv6地址需要用方括号括起来:
server {
listen 127.0.0.1:8080; # IPv4地址,8080端口
# listen [2001:3CA1:10F:1A:121B:0:0:10]:80; # IPv6地址,80端口
# listen [::]:80; # 听本机的所有IPv4与IPv6地址,80端口
# The rest of server configuration
}
上述配置,如果不写端口号,默认使用80端口,如果不写 IP ,则监听本机所有 IP。
server_name:
如果多个 server 的 listen IP 和端口号一模一样, Nginx 通过请求头中的 Host 与 server_name 定义的主机名进行比较,来选择合适的虚拟服务器处理请求:
server {
listen 80;
server_name lufficc.com www.lufficc.com;
...
}
server_name 的参数可以为:
通配符只能在开头或结尾,而且只能与一个 . 相邻。www.*.example.org 和 w*.example.org均无效。 但是,可以使用正则表达式匹配这些名称,例如 ~^www\..+\.example\.org$ 和~^w.*\.example\.org$ 。 而且 * 可以匹配多个部分。 名称 * .example.org 不仅匹配www.example.org,还匹配www.sub.example.org。
对于正则表达式:Nginx 使用的正则表达式与 Perl 编程语言(PCRE)使用的正则表达式兼容。 要使用正则表达式,且必须以 ~ 开头。
命名的正则表达式可以捕获变量,然后使用:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
小括号 () 之间匹配的内容,也可以在后面通过 $1 来引用,$2 表示的是前面第二个 () 里的内容。因此上述内容也可写为:
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
一个 server_name 示例:
server {
listen 80;
server_name api.lufficc.com *.lufficc.com;
...
}
同样,如果多个名称匹配 Host 头部, Nginx 采用下列顺序选择:
即优先级:api.lufficc.com > *.lufficc.com > api.* > 正则。
如果 Host 头部不匹配任何一个 server_name ,Nginx 将请求路由到默认虚拟服务器。默认虚拟服务器是指:nginx.conf 文件中第一个 server 或者 显式用 default_server 声明:
server {
listen 80 default_server;
...
}
配置 location
URI 与 location 参数的匹配
当选择好 server 之后,Nginx 会根据 URIs 选择合适的 location 来决定代理请求或者返回文件。
location 指令接受两种类型的参数:
对于前缀字符串参数, URIs 必须严格的以它开头。例如对于 /some/path/ 参数,可以匹配/some/path/document.html ,但是不匹配 /my-site/some/path,因为 /my-site/some/path 不以/some/path/ 开头。
location /some/path/ {
...
}
对于正则表达式,以 ~ 开头表示大小写敏感,以 ~* 开头表示大小写不敏感。注意路径中的 . 要写成 \. 。例如一个匹配以 .html 或者 .htm 结尾的 URI 的 location:
location ~ \.html? {
...
}
正则表达式的优先级大于前缀字符串。如果找到匹配的前缀字符串,仍继续搜索正则表达式,但如果前缀字符串以 ^~ 开头,则不再检查正则表达式。
具体的搜索匹配流程如下:
= 修饰符拥有最高的优先级。如网站首页访问频繁,我们可以专门定义一个 location 来减少搜索匹配次数(因为搜索到 = 修饰的匹配的 location 将停止搜索),提高速度:
location = / {
...
}
静态文件和代理
location 也定义了如何处理匹配的请求:返回静态文件 或者 交给代理服务器处理。下面的例子中,第一个 location 返回 /data 目录中的静态文件,第二个 location 则将请求传递给https://lufficc.com 域名的服务器处理:
server {
location /images/ {
root /data;
}
location / {
proxy_pass https://lufficc.com;
}
}
root 指令定义了静态文件的根目录,并且和 URI 拼接形成最终的本地文件路径。如请求/images/example.png,则拼接后返回本地服务器文件 /data/images/example.png 。
proxy_pass 指令将请求传递到 URL 指向的代理服务器。让后将来自代理服务器的响应转发给客户端。 在上面的示例中,所有不以 /images / 开头的 URI 的请求都将传递给代理服务器处理。
比如我把 proxy_pass 设置为 https://www.baidu.com/,那么访问 http://search.lufficc.com/ 将得到百度首页一样的响应(页面)(感兴趣的童鞋可以自己试一试搜索功能,和百度没差别呢):
server{
listen 80;
server_name search.lufficc.com;
location / {
proxy_pass https://www.baidu.com;
}
}
使用变量(Variables)
你可以使用变量来使 Nginx 在不同的请求下采用不同的处理方式。变量是在运行时计算的,用作指令的参数。 变量由 $ 开头的符号表示。 变量基于 Nginx 的状态定义信息,例如当前处理的请求的属性。
有很多预定义变量,例如核心的 HTTP 变量,你也可以使用 set,map 和 geo 指令定义自定义变量。 大多数变量在运行时计算,并包含与特定请求相关的信息。 例如,$remote_addr 包含客户端 IP 地址,$uri 保存当前URI值。
一些常用的变量如下:
| 变量名称 | 作用 |
|---|---|
| $uri | 请求中的当前URI(不带请求参数),它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如 /foo/bar.html。 |
| $arg_name | 请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name |
| $hostname | 主机名 |
| $args | 请求中的参数值 |
| $query_string | 同 $args |
| $request | 代表客户端的请求地址 |
| $request_uri | 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,不包含主机名,如:/cnphp/test.php?arg=freemouse。 |
| ... | ... |
一个简单的应用就是从 http 重定向到 https 时带上路径信息:
server{
...
return 301 https://lufficc.com$request_uri;
...
}
返回特定状态码
如果你的网站上的一些资源永久移除了,最快最简洁的方法就是使用 return 指令直接返回:
location /wrong/url {
return 404;
}
return 的第一个参数是响应代码。可选的第二个参数可以是重定向(对应于代码301,302,303和307)的 URL 或在响应正文中返回的文本。 例如:
location /permanently/moved/url {
return 301 http://www.example.com/moved/here;
}
return 指令可以包含在 location 和 server 上下文中:
server{
location / {
return 404;
}
}
或者:
server{
...
return 404;
location / {
...
}
}
错误处理
error_page 命令可以配置特定错误码的错误页面,或者重定向到其他的页面。下面的示例将在 404 错误发生时返回 /404.html 页面。
error_page 404 /404.html;
error_page 命令定义了如何处理错误,因此不会直接返回,而 return 确实会立即返回。当代理服务器或者 Nginx 处理时产生相应的错误的代码,均会返回相应的错误页面。
在下面的示例中,当 Nginx 找不到页面时,它将使用代码301替换代码404,并将客户端重定向到http://example.com/new/path.html 。 此配置很有用,比如当客户端仍尝试用旧的 URI 访问页面时,301代码通知浏览器页面已永久移除,并且需要自动替换为返回的新地址。
location /old/path.html {
error_page 404 =301 http:/example.com/new/path.html;
}
重写 URIs
rewrite 指令可以多次修改请求的 URI。rewrite 的第一个参数是 URI需要匹配的正则表达式,第二个参数是将要替换的 URI。第三个参数可选,指示是否继续可以重写或者返回重定向代码(301或302)。例如:
location /users/ {
rewrite ^/users/(.*)$ /show?user=$1 break;
}
您可以在 server 和 location 上下文中包括多个 rewrite 指令。 Nginx 按照它们发生的顺序一个一个地执行指令。 当选择 server 时,server 中的 rewrite 指令将执行一次。
在 Nginx 处理一组 rewrite 指令之后,它根据新的 URI 选择 location 。 如果所选 location 仍旧包含 rewrite 指令,它们将依次执行。 如果 URI 匹配所有,则在处理完所有定义的 rewrite 指令后,搜索新的 location 。
以下示例将 rewrite 指令与 return 指令结合使用:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
诸如 /download/some/media/file 的 URI 被改为 /download/some/mp3/file.mp3 。 由于 last 标志,后续指令(第二个 rewrite 指令和 return 指令)被跳过,但 Nginx 继续以更改后的 URI 处理请求。 类似地,诸如 /download/some/audio/file 的 URI 被替换为/download/some/mp3/file.ra。 如果 URI 不匹配 rewrite 指令,Nginx 将403 错误代码返回给客户端。
last 与 break的区别是:
附录
常用正则
全局变量
例如请求:http://localhost:88/test1/test2/test.PHP
$host:localhost
$server_port:88
$request_uri:/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# nginx
# web服务器配置
# web服务器
# nginx搭建web服务器
# 高性能WEB开发 nginx HTTP服务器篇
# Nginx如何提高Web应用的性能和安全性
# 正则表达式
# 客户端
# 第一个
# 多个
# 第二个
# 重定向
# 时计
# 代理服务器
# 不包含
# 重写
# 端口号
# 本机
# 如何处理
# 不匹配
# 可以使用
# 可选
# 不带
# 首页
# 不以
# 配置文件
相关文章:
如何在万网ECS上快速搭建专属网站?
建站之星后台密码遗忘或太弱?如何重置与强化?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何在西部数码注册域名并快速搭建网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
javascript基本数据类型及类型检测常用方法小结
平台云上自助建站如何快速打造专业网站?
行程制作网站有哪些,第三方机票电子行程单怎么开?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
建站之星如何实现PC+手机+微信网站五合一建站?
高性价比服务器租赁——企业级配置与24小时运维服务
建站之星如何快速生成多端适配网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
浅谈Javascript中的Label语句
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在IIS服务器上快速部署高效网站?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何通过.red域名打造高辨识度品牌网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何快速生成ASP一键建站模板并优化安全性?
如何通过可视化优化提升建站效果?
如何选择美橙互联多站合一建站方案?
设计网站制作公司有哪些,制作网页教程?
为什么Go需要go mod文件_Go go mod文件作用说明
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
如何高效完成自助建站业务培训?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
如何快速搭建高效简练网站?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
制作电商网页,电商供应链怎么做?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何通过西部建站助手安装IIS服务器?
网站微信制作软件,如何制作微信链接?
制作宣传网站的软件,小红书可以宣传网站吗?
如何在服务器上配置二级域名建站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
阿里云网站制作公司,阿里云快速搭建网站好用吗?
南宁网站建设制作定制,南宁网站建设可以定制吗?
建站主机默认首页配置指南:核心功能与访问路径优化
详解jQuery中基本的动画方法
制作网站的模板软件,网站怎么建设?
公司网站的制作公司,企业网站制作基本流程有哪些?
如何通过多用户协作模板快速搭建高效企业网站?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
广州建站公司哪家好?十大优质服务商推荐
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
*请认真填写需求信息,我们会在24小时内与您取得联系。