Nginx 入门
Aug 14, 2018 00:00 · 1176 words · 3 minute read
你的应用程序可能包含了多种 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 会基于 listen
和 server_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