anjia / blog

博客,积累与沉淀
106 stars 4 forks source link

nginx #36

Open anjia opened 5 years ago

anjia commented 5 years ago

简介

Nginx 是 HTTP Server。常用来做:

它和 Tomcat 虽然都叫 web server,但二者有本质的不同。Tomcat 是 Application Server,常用来做应用容器,让 Java App 运行在其中。

HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以 Nginx 有代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML文件、图片文件等)。通过 CGI 技术,也可以将处理过的内容通过 HTTP Server 分发。但是,HTTP Server 始终只是把服务器上的文件,如实的通过 HTTP 协议传输给客户端。

而 Application Server,则是应用执行的容器。它首先需要支持开发语言的 Runtime(对于 Tomcat 而言,就是 Java),保证应用能正常运行。其次,需要支持应用相关的规范,比如类库、安全方面的特性(对于 Tomcat 就是要提供 JSP/Sevlet 运行需要的标准类库等)。为了方便,Application Server 也会集成 HTTP Server 的功能,但不如专业的 HTTP Server 那么强大。所以 Application Server 往往是运行在 HTTP Server 背后,执行应用,将动态内容转化为静态内容之后,通过 HTTP Server 分发到客户端。

Nginx 的优点是占用资源少。

安装

在 Mac 下

brew install nginx
sudo brew services start nginx  // 如果 http://localhost:8080 看到 Welcome to nginx! 页面,说明启动成功
sudo brew services stop nginx   // 关闭 nginx 服务
sudo brew services reload nginx   // 重新加载

nginx -v                   // 查看版本
nginx -s reload  // 重新加载
nginx -s stop    // 停止

sudo nginx -t  // sudo
// nginx 会测试配置文件的语法,告诉你配置文件是否正确,同时也会给出配置文件的路径

位置

anjia commented 5 years ago

nginx.conf

配置文件,分为四部分:

  1. main 全局设置。eg.工作进程数、运行身份等与具体业务无关的参数
  2. server 主机设置。eg.指定虚拟主机域名、IP 和端口
    • 继承 main
  3. location URL匹配特定位置后的设置。匹配网页位置,eg.根目录 / /images 等
    • 继承 server
  4. upstream 上游服务器设置。eg.反向代理、后端服务器的负载均衡等
    • 不继承其它也不会被继承,它有自己的特殊指令

每个部分都包含若干指令。

指令,有两类:

  1. 简单指令 eg. root /data/www;
  2. block 指令 eg.{ ...附加指令... }
    • {} 就意味着一个 context
    • 最外层的是 main context

eg.用作静态服务器时

http {
    server {
        location / {
            root /data/www;  # 静态网页和文件
        }
        location /images/ {
            root /data;      # 图片等文件
        }
    }
}
# 以上便是在 http 模块下的 server 模块里新建了两个 location 模块
anjia commented 5 years ago

可配置的功能们。并不全,初窥,有个第一印象先

常用指令说明

  1. main
    • woker_processes worker 角色的工作进程的个数。master 进程是接收并分配请求给 worker 处理
    • worker_cpu_affinity 高并发时,cpu 粘性
    • orker_rlimit_nofile 操作系统最大的限制
    • events 部分
      • worker_connections 每一个 worker 进程能并发处理(发起)的最大连接数
      • use epoll 在 Linux 操作系统下,nginx 默认使用 epoll 事件模型-效率相当高
  2. http
    • sendfile: on 开启高效文件传输模式
    • keepalive_timeout: 65 长连接超时时间,单位是 s
    • send_timeout 响应客户端的超时时间
    • client_max_body_size 允许客户端请求的最大单文件字节数
    • client_body_buffer_size 128k 缓冲区代理缓冲用户端请求的最大字节数
    • 模块 http_proxy,反向代理
      • proxy_connect_timeout: 60 nginx 跟后端服务器连接超时时间(代理连接超时)
      • proxy_read_timeout: 60 代理接收超时
      • proxy_buffer_size: 4k
      • proxy_buffers
      • proxy_busy_buffers_size
      • proxy_max_temp_file_size
      • proxy_temp_file_write_size
    • 模块 http_gzip
      • gzip: on
      • gzip_min_length
      • gzip_buffers
      • gzip_http_version
      • gzip_comp_level
      • gzip_types
      • gzip_proxied
      • gzip_vary
    • 模块 http_stream
      • 通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡
    • 3. server 虚拟主机
      • listen
      • server_name
      • 4. location
        • root /var/www/html 定义服务器的默认网站根目录
        • index index.html index.htm 定义路径下默认访问的文件名
        • proxy_pass 反向代理
        • proxy_xxx
  1. server 虚拟主机,http 服务上支持若干虚拟主机,每个虚拟主机对应一个 server 配置项
  2. location。在 http 服务中,某些特定的 URL 对应的一系列配置项

... etc.

anjia commented 5 years ago

实战

使用 include 指令实现 nginx 多虚拟主机配置

nginx.conf 配置文件的最后一行是 include servers/*;。所以,我们可以将自定义的 nginx 的 server 配置软件链接到 servers/ 目录下。

创建软连接:ln -s /xxx/.../nginx.conf hello-world.server.conf

server {
    listen        8369;
    server_name   m.hello.com;
    root          /.../dist;
    index         index.html index.htm;

    location / {
        etag       on;
        expires    max;
        try_files  $uri $uri/ /index.html;  # Vue 的前端路由可生效
    }
}

然后重启 nginx。详见 安装

场景

node.js+pm2+nginx

若是内网,可部署个内网 DNS Server,将 server_name 解析到具体服务器 ip