Nginx 入门

Aug 14, 2018 00:00 · 1176 words · 3 minute read Nginx

你的应用程序可能包含了多种 HTML、CSS、JavaScript 静态文件,后端 API 服务和甚至不同的网络服务。你可能正在寻觅一款合适的网络服务器来托管它们。Nginx 也许就是你想要的。

Nginx (ɛndʒɪnˈɛks) is a web server which can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache.

首先 Nginx 是一个网络服务器,使用 非阻塞事件驱动 架构(有点像 Node.js)实现高性能。也能用来做负载均衡、HTTP 缓存,或者用作反向代理。

这里我介绍如何安装 Nginx 和一些基本配置操作。

安装

两种方法,使用已经编译好的二进制文件或者自己手动编译源码。

第一种方法简单快速,但是编译源码能够导入多种第三方模块来为 Nginx 赋能,也就是根据实际需求定制化。

安装预先编译好的包,唯一要做的就是输入:

$ sudo apt-get update
$ sudo apt-get install nginx

安装完后,打印下版本号来确认是否安装成功:

$ nginx -v
nginx version: nginx/1.12.2

进入 /etc/nginx/ 路径,里面有一堆文件和文件夹。首当其冲是 nginx.conf

配置

Nginx 的核心配置都在 nginx.conf 文件中,默认:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    include /etc/nginx/sites-enabled/*;
}

events 和 http 结构都叫上下文。这种层次化的结构可以实现嵌套和继承,也可以根据需要覆盖掉某些设置。配置当然是按需调整,但是 Nginx 简单到有时候就用默认配置也行。配置文件里有些重要的字段:

  • worker_processes 定义 Nginx 使用的工作进程数量。因为 Nginx 单线程,所以这个值最好配置成 CPU 核心数量。
  • worker_connections 每个工作进程的最大并发连接数,也就是 Nginx 可以同时服务多少人。
  • access_log & error_log 访问和错误行为的日志,以后要被用来调试和分析。
  • gzip Nginx 的回复是否启用 gzip 压缩,默认关闭。开启的话会带来巨大的性能提升。gzip 还有个辅助设置 gzip_comp_level 代表压缩等级(1到10),通常不应该大于6,CPU 开销不合算。

Nginx 能支持多个站点,配置文件可以放在 /etc/nginx/sites-available 路径下,然后把需要上线的链接至 /etc/nginx/sites-enabled 路径,重启 Nginx 就行了。

sites-available 路径下是虚拟主机的配置文件,每个站点都对应一个。一份典型的配置文件看起来是这样的:

upstream remoteApplicationServer {
    server 10.10.10.10;
}

upstream remoteAPIServer {
    server 20.20.20.20;
    server 20.20.20.21;
    server 20.20.20.22;
    server 20.20.20.23;
}

server {
    listen 80;
    server_name www.customapp.com customapp.com
    root /var/www/html;
    index index.html

        location / {
            alias /var/www/html/customapp/;
            try_files $uri $uri/ =404;
        }

        location /remoteapp {
            proxy_set_header   Host             $host:$server_port;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass http://remoteAPIServer/;
        }

        location /api/v1/ {
            proxy_pass https://remoteAPIServer/api/v1/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_redirect http:// https://;
        }
}

server 上下文定义了一个虚拟服务器来处理客户端的请求。可以有多个服务器块,NGINX 会基于 listenserver_name 设置选择。

在 server 块里,定义 location 上下文来决定如何处理客户端请求。无论何时有请求过来,Nginx 都会试着匹配并作出相应的处理。

  • try_files 分发指向的根目录中的静态文件
  • proxy_pass 把请求转发到某个特定的被代理的服务器实例
  • rewrite 根据正则表达式重写 URI,被另一个 location 块处理

upstream 上下文定义了 Nginx 代理请求的服务器实例池。在我们创建完一个 upstream 块并在里面定义一个服务器实例,可以通过 location 块里的名字来引用它。而且,upstream 上下文能分配多个服务器实例来实现请求的负载均衡。

开启 NGINX

配置完了,用下面的命令来开启 Nginx:

$ sudo service nginx start

或者修改完配置文件,只要重新加载就行:

service nginx reload

最后检查 Nginx 的运行状态

$ service nginx status