为什么要用server_name

当我们通过hosts文件指定IP与域名的对应关系(如:10.10.124.120 www.myweb.com)之后,对域名的访问会映射成对应的IP。这个ip就是nginx的公网IP 。然后server name 为虚拟服务器的识别路径。因此不同的域名会转发到对应的应用服务器中去。

结论

1、完全匹配 demo.com 2、通配符在前的,如*.org 3、在后的,如demo.* 4、正则匹配,如~^(.+)?\.demo.com 如果都不匹配 1、优先选择listen配置项后有default或default_server的 2、找到匹配listen端口的第一个server块

测试案例

安装依赖的模块

  1. apt install libnginx-mod-http-lua

hosts文件添加映射

  1. 127.0.0.1 demo.com
  2. 127.0.0.1 www.demo.com
  3. 127.0.0.1 demo.org
  4. 127.0.0.1 xyz.demo.com
  5. 127.0.0.1 demo.xyz

配置 nginx文件

  1. server {
  2. listen 80;
  3. server_name demo.com;
  4. location / {
  5. default_type text/html;
  6. content_by_lua 'ngx.say("完全匹配")';
  7. }
  8. }
  9. server {
  10. listen 80;
  11. server_name ~^(.+)?\.demo.org;
  12. location / {
  13. default_type text/html;
  14. content_by_lua 'ngx.say("正则匹配org")';
  15. }
  16. }
  17. server {
  18. listen 80;
  19. server_name *.org;
  20. location / {
  21. default_type text/html;
  22. content_by_lua 'ngx.say("通配符*匹配在前面")';
  23. }
  24. }
  25. server {
  26. listen 80;
  27. server_name demo.*;
  28. location / {
  29. default_type text/html;
  30. content_by_lua 'ngx.say("通配符*匹配在后面")';
  31. }
  32. }
  33. server {
  34. listen 80;
  35. server_name ~^(.+)?\.demo.com;
  36. location / {
  37. default_type text/html;
  38. content_by_lua 'ngx.say("正则匹配com")';
  39. }
  40. }

访问测试

  1. # curl demo.com
  2. 完全匹配
  3. # curl www.demo.com
  4. 正则匹配com
  5. # curl demo.org
  6. 通配符*匹配在前面
  7. # curl xyz.demo.com
  8. 正则匹配com
  9. # curl demo.xyz
  10. 通配符*匹配在后面

nginx热更新

下载新版nginx编译

  1. wget http://nginx.org/download/nginx-1.20.1.tar.gz
  2. tar xf nginx-1.20.1.tar.gz
  3. cd nginx-1.20.1
  4. ./configure --prefix=/usr/local/nginx-1.20.1
  5. make

备份之前的nginx

  1. # 示例
  2. cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
  3. # 将新make生成的nginx 拷贝过来覆盖
  4. cp /usr/local/nginx-1.20.1/sbin/nginx /usr/local/nginx/sbin/nginx

发送信号给之前的进程,通知热部署

  1. kill -USR2 ${NGX_PID} # master进程
  2. # 之后 nginx 会重新起一个master进程,使用的是新版本的nginx
  3. # 使用 ps -ef |grep nginx 会看到两个 master进程
  4. # 再次给老的进程发送优雅关闭进程的信号
  5. kill -WINCH ${NGX_PID}
  6. # 此时老的worker进程已经没有了,master进程仍然在,新请求都切换到新的master进程去了
  7. # master 未关闭的原因是可以通过 -s reload 重新将 worker拉起来,防止新的版本nginx有问题,用于回退

静态文件服务器

gzip on; 开启文件传输压缩,提高传输效率 gzip_min_length 1000; 低于1000则不压缩 gzip_comp_level 2; 压缩级别 gzip_types ; 压缩类型 charset utf-8; 设置防止中文乱码 alias net/; nginx工作目录下net目录作为根目录 autoindex on; 打开索引,不添加则会报403错误,因为示例中没有index,

  1. gzip on;
  2. gzip_min_length 1000;
  3. gzip_comp_level 2;
  4. gzip_types text/plain application/xml text/css image/jpeg;
  5. server {
  6. listen 8080;
  7. server_name net.cortex.com;
  8. charset utf-8;
  9. location / {
  10. alias net/;
  11. autoindex on;
  12. }
  13. }

location 测试

测试环境

  • docker
  • nginx镜像

    启动命令

    1. docker run -d --name nginx-demo nginx:latest
    2. docker exec -it nginx-demo /bin/bash

    添加配置文件

    • merge_slashes 默认on,自动合并多个’/‘为一个,一般在url中有base64编码时,才需要设置off

前缀字符串

  • 常规
  • = 精确匹配
  • ^~ 匹配上后则不再进行正则表达式匹配
  • ~ 大小写敏感的正则匹配
  • ~* 忽略大小写的正则匹配

    配置文件 /etc/nginx/conf.d/location.conf

    ```nginx server {

    server_name www.cortex.com; default_type text/plain; merge_slashes off;

    location ~ /Test1/$ { return 200 ‘match Test1 with doll end!\n’; }

    location ~* /Test1/$ { return 200 ‘match ignore case Test1 with doll end!\n’; }

    location /Test1 { return 200 ‘prefix string match!\n’; }

    location ^~ /Test1/ { return 200 ‘no regular expressions match!\n’; }

}

  1. <a name="Ucvyz"></a>
  2. #### nginx限制上传和下载文件大小
  3. ```bash
  4. 上传大小限制
  5. client_max_body_size 5000m;
  6. 下载大小限制
  7. proxy_max_temp_file_size 5000m;