• http
  • server
  • upstream
  • location
  • Proxy

这四个模块是常用的模块,一般我们有这四个指令就可以将网站文件通过端口映射出来。

  1. # 指令块
  2. http {
  3. # 指令
  4. # mime.type 含有很多的文件后缀名,和文件关系对照表。
  5. include mime.types;
  6. upstream feup {
  7. server 127.0.0.1:3000;
  8. }
  9. server {
  10. listen 80;
  11. server_name localhost;
  12. location / {
  13. root /var/www/html;
  14. index index.html index.htm;
  15. }
  16. }
  17. server {
  18. listen 3000;
  19. server_name localhost;
  20. location / {
  21. root /var/www/feup;
  22. index index.html;
  23. try_files $uri /index.html @router;
  24. }
  25. }
  26. server {
  27. listen 80;
  28. server_name feup.kaikeba.com;
  29. location / {
  30. proxy_pass http://feup;
  31. proxy_http_version 1.1;
  32. proxy_set_header Upgrade $http_upgrade;
  33. proxy_set_header Connection $connection_upgrade;
  34. }
  35. }
  36. }

上面的配置文件包含了一些最简单并常用的访问配置。分别对应下面三个地址:

  1. # nginx的默认访问地址,对应/var/www/html目录
  2. http://127.0.0.1
  3. # feup打包后的访问地址,对应/var/www/feup目录,而且做了路由重定向
  4. http://127.0.0.1:3000
  5. # 我们将feup.kaikeba.com映射到了3000端口,接下来做一个本地hosts映射就可以通过这个地址来访问feup了
  6. http://feup.kaikeba.com

指令 directive

  1. include mime.types;

指令可以接受多个参数,参数用空格分割。

可以将它看成 js 里的函数一样。

  1. // 伪代码
  2. function directive(feature, ...props) {
  3. return feature(...props);
  4. }

两个指令之间,使用分号作为分隔符。所以也可以像下面这样写

通常不建议这样,因为可读性会变得很差。

  1. location ~* \.(gif|jpeg|png|jpg)$ {
  2. expires 3m; proxy_cache my_zone;
  3. }

指令块 directiveBlock

后面跟大括号的就是指令块,它的作用就是将多条指令组合在一起。

有些指令块可以有名字,有些是没有名字的。而且指令块内也可以包含其他指令块。

至于什么时候有名字,什么时候不带名字,这个是由提供这个指令块的模块来决定的,可以决定这个指令块有多少个参数。

  1. http {
  2. # upstream 把 server指令 放在了 feup 指令块下面。
  3. upstream feup {
  4. server 127.0.0.1:3000;
  5. }
  6. }

http 模块

代表在 http 模块内的所有指令和指令块,都是由 http 模块去解析去执行的。

upstream 模块

代表着上游服务,比如我们有个 node 服务、tomcat 服务。需要与这些服务交互的时候可以定义一个 upstream。

  1. # Syntax:
  2. upstream name { ... }
  3. # 默认情况下,使用加权循环平衡在服务器之间分配请求
  4. # 默认顺序轮询
  5. # [http]
  6. upstream api_server_upstream {
  7. server 127.0.0.1:3000;
  8. server 127.0.0.1:3001;
  9. server 192.168.111.111:80;
  10. }
  11. # 带权重
  12. # [http]
  13. upstream api_server_name {
  14. # 如果有7个请求,其中5个请求会到这个3000端口中。其余两个会被分配到其他两个,如果有一个服务挂掉了,那么将会向下重新请求,如果所有的都没有得到响应,那么将会返回最后一个服务的请求结果。
  15. server 127.0.0.1:3000 weight=5;
  16. server 127.0.0.1:3001 weight=1;
  17. server 192.168.111.111:80 weight=1;
  18. }
  19. # ip_hash
  20. # 根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面。
  21. # 从而保证同一个用户过来的请求,只会进入到同一台特定的服务中,会话不会出现在其他服务中。
  22. #
  23. # 一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;
  24. # 因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱;
  25. #
  26. # [http]
  27. upstream api_server_upstream {
  28. ip_hash;
  29. server 127.0.0.1:3000;
  30. server 127.0.0.1:3001;
  31. server 192.168.111.111:80;
  32. }
  33. # 设备状态 down/backup
  34. # [http]
  35. upstream api_server_upstream {
  36. ip_hash;
  37. server 203.18.225.19:80 down; // 服务器暂时不参与负载
  38. server 203.18.225.19:81;
  39. server 203.18.225.20:80 backup; // 当其他过于繁忙时,参与负载
  40. }
  41. # 还有更多用法,可以下去了自己研究研究。

server 模块

用于对应一个域名或者一组域名。

location 模块

url 表达式,针对不同 url 做出不同的指令动作。

语法

  1. # Syntax:
  2. # [server]
  3. location [ = | ~ | ^~ | ~* ] uri { ... }
  4. location @name { ... }

具体使用

  1. # location = // 精准匹配
  2. # location ^~ // 前缀匹配
  3. # location ~ // 正则匹配
  4. # location ~* // 不区分大小写正则匹配
  5. # location / // 无修饰符的匹配
  6. # 完全匹配
  7. location = /a {
  8. [ configuration A ]
  9. }
  10. # 前缀匹配优于正则匹配
  11. location ^~ /images/ {
  12. [ configuration D ]
  13. }
  14. # 区分大小写正则匹配
  15. location ~ \.(gif|jpg|jpeg)$ {
  16. [ configuration E ]
  17. }
  18. # 不区分大小写正则匹配
  19. location ~* \.(gif|jpg|jpeg)$ {
  20. [ configuration E ]
  21. }
  22. # 匹配前缀
  23. location /a {
  24. [ configuration B ]
  25. }

alias 和 root

  1. # [server]
  2. location /image {
  3. alias /root/html/image/;
  4. }
  5. alias: 当请求/image/a.jpg-->替换成 /root/html/image/a.jpg
  6. # [server]
  7. location /image {
  8. root /root/html/image;
  9. }
  10. root: 当请求/image/a.jpg-->替换成 /root/html/image/image/a.jpg
  • alias 匹配路径全替换
  • root 匹配路径前追加 root 路径

    Proxy

    1. # 配合location使用。
    2. proxy_pass http://xxx;
  • 使用缓存加速反向代理

  • 通用代理

    实现一个简单的反向代理负载均衡

    1. worker_processes 1;
    2. events {
    3. worker_connections 1024;
    4. }
    5. http {
    6. include mime.types;
    7. default_type application/octet-stream;
    8. upstream proxyuri {
    9. # 被代理的服务器列表
    10. server 101.200.110.12:8080 weight=2; # 这个配置比较高,所以让他承担了一半的请求
    11. server 101.200.110.13:8080 weight=1;
    12. server 101.200.110.14:8080 weight=1;
    13. server 101.200.110.15:8080 backup; # 当其他过于繁忙的时候,参与负载
    14. }
    15. server {
    16. listen 80;
    17. server_name xx.kaikeba.com;
    18. location / {
    19. proxy_pass http://proxyuri;
    20. }
    21. }
    22. }