当前位置: 首页 > news >正文

nginx入门-server基础

一般情况下下载好nginx后都是修改conf下的nginx.conf文件,

本篇主要写的是nginx.conf中的server_block

基础写法

server {
listen 80;
server_name localhost;

location / {
root html/sky;
index index.html index.htm;
}


location /api/ {
      proxy_pass http://192.168.88.95:8080/admin/;
}
}

接下来讲的是server_block中的各个指令的简单用法

listen

监听可配置成 IP 或 port 或 IP:port

# 监听所有IP80端口(本机、局域网、公网(如果配置了)都可以访问
listen 80;
# 同上
listen *:80;
# 只监听听本机localhost80端口(80是默认端口,可以不写)
listen 127.0.0.1:80;
listen localhost;
# 只监听特定IP80端口
listen 192.168.88.95:80;

最佳实践:

正式环境中,为了明确和安全性,应该总是完整地写出listen指令,使用 listen IP:port

如果只提供本地服务,则使用localhost/127.0.0.1增强安全性

server_name

主要用于区分,可以随便起名字

在同一台机器上,listen+server_name不能重复。

server {listen       80;server_name  www.waimai.com;location / {root   html/sky;index  index.html index.htm;}
}

server {listen       80;server_name  www.dianping.com api.dianping.com;location / {root   html/personnel;index  index.html index.htm;}
}
 

例如上面的例子中,虽然都是监听了80端口,但是会根据域名或主机名去匹配对应的server

curl http://www.waimai.com 会访问第一个server

curl http://www.dianping.com 则是访问第二个server

此外,server还支持匹配规则和特殊值,

例如 *.dianping.com包含了上述的两个server_name。正则表达式中 ~ 的使用规则;以及作为兜底的 _ 特殊值(匹配那些没有匹配任何server_name的请求)

default_server

用于捕获错误请求,防止恶意请求进入正式站点。

例如上述情况中,我本地访问了http://localhost,不会匹配到任意一个路由。此时nginx会将请求指定到默认服务器。(如果没设置default_server,那么nginx会将第一个server block视为默认服务器)

# 显式设置为默认服务器,用于处理所有未知 Host 的请求
server {
    listen 80 default_server; # 关键参数:default_server
    server_name _; # 使用一个绝不会匹配的占位符
    # 可以返回一个错误页面
    return 444; # Nginx 特有的非标准状态码,直接关闭连接
    # 或者跳转到主站
    # return 301 http://waimai;
}
server {
    listen       80;
    server_name  www.waimai.com;;
    ...
}
server {
    listen       80;
    server_name  *.dianping.com;
    ...
}

location

主要作用是根据请求的URI(域名后的路径部分)来处理请求

匹配修饰符:

1. = (优先级最高,精确匹配)

location = /login {
  # 只匹配uri是/login的,多一个/都不行root /admin/login
  index login.html }

2. ^~ (优先级第二高,前缀匹配)一旦匹配成功,不再对后续的location进行匹配

location ^~ /static/ {# 匹配以 /static/ 开头的所有路径,如 /static/css/style.cssroot /var/www;
}

3. ~ 、~*(优先级第三,这俩谁出现在前面谁高,区分大小写和不区分大小写的正则匹配)

4. 不带修饰符的前缀匹配(他会选择最长匹配的前缀)

常用命令:

root(根目录) vs alias(目录别名)

location /api {
  root /var/www
  # 假设uri是 /api/login
  # 那么实际会映射到 /var/www/api/login上 即 root+URI
}

location /api {
  alias /var/www
  # 假设uri是 /api/login
  # 那么实际会映射到 /var/www/login上(这里不会保留location路径)即 alias+(URI-location)
}

proxy_pass(反向代理)

# 反向代理不带/结尾
location /api/ {proxy_pass http://backend;# uri为/api/user时,会转发请求到http://backend/api/users# 这里是不带路径,以主机名结尾的,整个uri会被原样追加在目标地址后后 }

# 反向代理带/结尾 # 简单的替换 location /v1/ {proxy_pass http://backend/api/;# uri为/v1/user时,会转发请求到http://backend/api/user# 这里是带路径,location部分(v1)会被替换为proxy_pass中的路径(/api/) } # 根路径重定向 location /v1/ {proxy_pass http://backend/;# uri为/v1/user时,会转发请求到http://backend/user# 这里是带路径,location部分(v1)会被替换为proxy_pass中的路径(/) }

使用proxy_pass,由于是反向代理,无法获取用户的真实IP(都成了nginx的IP,因为现在是由nginx代替客户端向后端发起TCP连接),为了解决这个问题,nginx提示了一些proxy_pass的相关配置

location /api/ {proxy_pass http://backend;
  # 传递真实客户端IP信息
  proxy_set_header Host $host;
  # remote_addr表示客户端IP
  proxy_set_header X-Real-IP $remote_addr;
  # proxy_add_x_forwarded_for自动追加当前客户端IP到现有的 X_forwarded_for的头部
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme; }

try_files(文件查找)

location / {try_files $uri $uri/ /index.html =404;# 尝试顺序:# 1. 直接访问 $uri 文件# 2. 访问 $uri/ 目录(如果存在)# 3. 都找不到则返回 /index.html。此外最后一个文件也可以是状态码(需要在状态码前面加上=)
}

rewrite(URL重写)

location /blog/ {rewrite ^/blog/(\d+)/(.*)$ /blog.php?id=$1&titile=$2;# 将 /blog/123/some-title 重写为 /blog.php?id=123&title=some-title
}

location /api和 location /api/的区别?

location /api/是一个目录匹配,只匹配以 /static/ 开头的URI,

location /api则是一个前缀匹配,匹配以 /static 开头的所有URI

例如

# 都匹配
/static/png/login.png
# 这里没有后面的 / ,因此只匹配/static,不匹配/static/ /static
# 这里就只匹配/static了
/static-page

他们的应用场景:

/api/适合静态资源目录,明确这个是一个目录而非文件前缀

/api则适合API版本控制,例如 /api/v1 可以包含 /api/v1 /api/v1 /api/v1/login

http://www.jsqmd.com/news/29406/

相关文章:

  • Typora使用命令
  • 免费智普大模型调用
  • 嵌入式C语言寄存器操作
  • ubuntu使用命令
  • PC 指针为何不等于执行地址?
  • VIM使用教程
  • 【Shell脚本】 目录清理脚本
  • 第一次团队作业
  • 题解:CF1975E Chain Queries
  • 题解:P4895 独钓寒江雪
  • 题解:P7201 [COCI 2019/2020 #1] Džumbus
  • 题解:CF913D Too Easy Problems
  • 题解:CF875C National Property
  • 题解:CF1037E Trips
  • lecms在使用redis中设置他缓存时间
  • 题解:CF387E George and Cards
  • 博客一年纪
  • 题解:AT_abc307_f [ABC307F] Virus 2
  • 题解:CF291E Tree-String Problem
  • java操作sip
  • CH59X/CH58X蓝牙主机设置白名单
  • 题解:CF712D Memory and Scores
  • 思维的断章,觉知的永恒:一个基于“内观照叙事模型”的认知革命与跨学科范式重构
  • 拾壹月贰
  • struct page
  • NFS 服务端/客户端配置
  • CSP-S2025 题目解析
  • [Record] CSP-S 2025 邮寄
  • 2025 CSP-S 游记
  • [题解]CSP-S 2025 T1~T3 题解