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.css
    root /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

posted @ 2025-11-02 22:32  天启A  阅读(12)  评论(0)    收藏  举报