Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nginx #36

Open
anjia opened this issue Dec 11, 2018 · 3 comments
Open

nginx #36

anjia opened this issue Dec 11, 2018 · 3 comments
Labels

Comments

@anjia
Copy link
Owner

anjia commented Dec 11, 2018

简介

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 会测试配置文件的语法,告诉你配置文件是否正确,同时也会给出配置文件的路径

位置

  • 查看 nginx 的路径 ps aux | grep nginx
  • 查看 nginx 配置文件的路径 /..../nginx -t
@anjia
Copy link
Owner Author

anjia commented Dec 11, 2018

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
Copy link
Owner Author

anjia commented Dec 11, 2018

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

常用指令说明

  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
Copy link
Owner Author

anjia commented Dec 11, 2018

实战

使用 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

  • node.js 启动后端服务
  • pm2 让 node.js 服务永存
  • nginx 配置
    • location 到各个资源,eg. html, static, api
      • api 可通过 proxy_pass 反向代理
      • static 可直接映射到具体目录中
      • 根文件啥的,location /
    • server_name 想生效,需要个域名解析服务

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

@anjia anjia added the 网络 label Dec 18, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant