美文网首页
部署使用 Nginx

部署使用 Nginx

作者: wayyyy | 来源:发表于2022-01-16 22:13 被阅读0次

全文参考自:Nginx 从入门到实践,万字详解!

安装
# yum install nginx
# nginx -v 
  nginx version: nginx/1.20.1
# systemctl enable nginx  # 设置开启启动
# systemctl start nginx  # 启动nginx

注意,有时还需要防火墙开放端口:

  • 日志文件
    /var/log/nginx 存放日志文件,可以用于定位问题。
nginx 操作常用命令
nginx -s reload  # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen  # 重启 Nginx
nginx -s stop    # 快速关闭
nginx -s quit    # 等待工作进程处理完成后关闭
nginx -T         # 查看当前 Nginx 最终的配置
nginx -t -c <配置路径>    # 检查配置是否有问题,如果已经在配置目录,则不需要-c
配置文件语法

/etc/nginx/conf.d/ 文件夹,是进行子配置的配置项存放处
/etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入

配置结构图可以如下设置:

main        # 全局配置,对全局生效
├── events  # 配置影响 Nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...
  • nginx 典型配置
    user  nginx;                        # 运行用户,默认即是nginx,可以不进行设置
    worker_processes  1;                # Nginx 进程数,一般设置为和 CPU 核数一样
    error_log  /var/log/nginx/error.log warn;   # Nginx 的错误日志存放目录
    pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 存放位置
    
    events {
        use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
        worker_connections 1024;   # 每个进程允许最大并发数
    }
    
    # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
    http {
        # 设置日志模式
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
        
        # Nginx访问日志存放位置     
        access_log  /var/log/nginx/access.log  main;   
      
        sendfile            on;   # 开启高效传输模式
        tcp_nopush          on;   # 减少网络报文段的数量
        tcp_nodelay         on;
        keepalive_timeout   65;   # 保持连接的时间,也叫超时时间,单位秒
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表
        default_type        application/octet-stream;   # 默认文件类型
    
        include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    
        server {
            listen  80;
            server_name   localhost;
            
            localtion / {
                  root    /usr/share/nginx/html;
                  index   index.html index.htm;   # 默认首页文件
                  deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
              allow 172.168.33.44; # 允许访问的ip地址,可以为all 
            }  
            
            error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
            error_page 400 404 error.html;   # 同上
        }
    }
    

server 块可以包含多个 location 块,location 指令用于匹配 uri,语法:

location [ = | ~ | ~* | ^~] uri {
    ...
}

指令后面:
1、= 精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;
2、^~ 用于不含正则表达式的 uri; 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;
3、~ 表示用该符号后面的正则去匹配路径,区分大小写;
4、~* 表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~ 优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;

  • 全局变量
    Nginx 有一些常用的全局变量,你可以在配置的任何位置使用它们:
    全局变量 功能
    $host 请求信息中的 Host,如果请求中没有 Host 行,则等于设置的服务器名,不包含端口
    $request_method 客户端请求类型,如 GET、POST
    $remote_addr 客户端的 IP 地址
    $args 请求中的参数
    $arg_PARAMETERGET 请求中变量名 PARAMETER 参数的值,例如:$http_user_agent(Uaer-Agent 值), $http_referer...
    $content_length 请求头中的 Content-length 字段
    $http_user_agent 客户端agent信息
    $http_cookie 客户端cookie信息
    $remote_addr 客户端的IP地址
    $remote_port 客户端的端口
    $http_user_agent 客户端agent信息
    $server_protocol 请求使用的协议,如 HTTP/1.0、HTTP/1.1
    $server_addr 服务器地址
    $server_name 服务器名称
    $server_port 服务器的端口号
    $schemeHTTP 方法(如http,https)

还有更多的内置预定义变量,可以直接搜索关键字「nginx内置预定义变量」

动态请求和静态请求分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

把动态和静态的请求分开。方式主要有两种:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
另外一种是动态跟静态文件混合在一起发布, 通过 Nginx 配置来分开。

通过 location 指定不同的后缀名实现不同的请求转发:通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量:
具体 expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化。则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

server {
    location /www/ {
        root /data/;
        index index.html index.htm;
    }
  
    location /image/ {
        root /data/;
        autoindex on;
    }
}
负载均衡

请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。

主要配置如下:

http {
    upstream myserver {
        # ip_hash;  # ip_hash 方式
        # fair;   # fair 方式
        server 127.0.0.1:8081;  # 负载均衡目的服务地址
        server 127.0.0.1:8080;
        server 127.0.0.1:8082 weight=10;  # weight 方式,不写默认为 1
  }
 
  server {
    location / {
        proxy_pass http:  // myserver;
        proxy_connect_timeout 10;
    }
  }
}

Nginx 提供了好几种分配方式,默认为轮询,就是轮流来:

  • 轮询
    默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务挂了,能自动剔除;

  • weight
    权重分配,指定轮询几率,权重越高,在被访问的概率越大,用于后端服务器性能不均的情况;

  • ip_hash
    每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决动态网页 session 共享问题。负载均衡每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的;

  • fair(第三方)
    按后端服务器的响应时间分配,响应时间短的优先分配,依赖第三方插件 nginx-upstream-fair,需要先安装;

相关文章

网友评论

      本文标题:部署使用 Nginx

      本文链接:https://www.haomeiwen.com/subject/yqqxhrtx.html