前言
Nginx作为高性能的http服务器,知名度不必多言,相似产品中无出其右。本篇随笔记录我认为较为重要的原理和配置。
1. 原理解析
1.1 结构
以上是Nginx的结构图,其包含一个master和n个worker,master_processes用于外部通信和统一管理其下worker_processes,因此可以做到重启时不中断服务。另外,Nginx采用了异步非阻塞的方式来处理请求,避免了cpu闲置,这是其高性能的主要原由。
1.2 模块
Nginx从功能上可分为以下三大类:
Handlers(处理器模块):用于直接处理请求,并进行输出内容和修改headers信息等操作,一般只能有一个。
Filters(过滤器模块):主要对处理器模块输出的内容进行修改操作,然后输出。
Proxies(代理模块):主要是upstream模块,与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
1.3 工作流程
上图是Nginx常规的HTTP请求和响应过程,当接到请求时,通过查找配置文件将其映射到一个location block,并按照其中所配置的各个指令,启动不同的模块去完成工作。通常一个location中的指令会涉及一个handler模块和多个filter模块。另外,Nginx的模块属于静态编译方式,在启动后自动加载。
2. 配置摘要
Nginx对于我来说最常规的运用就是静态资源处理和反向代理,因此我只记录这些相关的配置。Nginx配置一般分为三部分:global、events和http,通用基本配置一般保存在/etc/nginx/nginx.conf
文件中,具体的服务配置一般保存在/etc/nginx/conf.d/
文件夹下。
2.1 Global和Events配置
一般在nginx.conf
配置文件的开头位置设置一些与具体业务无关的参数,如下:
user nginx; # 用户或者用户组
worker_processes 2; # worker进程数,一般与服务器的虚拟内核数相等
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
Events中需要自行调整的就一个必要参数:worker_connections,这个数值涉及到最大连接数的计算,即:
# nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections
# nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/4
当然这个最大连接数还与系统可打开的最大文件数有关,max_clients必须要小于file-max(cat /proc/sys/fs/file-max
),我的配置:
events {
worker_connections 2048;
}
2.2 http服务器配置
2.2.1 全局配置
一般情况下虚拟主机以外的配置保持默认就行了,如:gzip压缩,ip获取等一般都交给云服务器的负载均衡处理了,写一下默认值吧:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
2.2.2 server虚拟主机配置
真正的与业务相关的配置都在这个小节,顺着流程来讲吧。现在不论是公司站还是个人站都应该普及了https了吧(运营商的http劫持实在太流氓了,特别是手机端的web,再强调一遍,流氓,流氓...),这里面涉及到一个https强制跳转问题,可以让负载均衡的80端口来监听服务器的81端口进行重定向:
server {
listen 81;
return 301 https://$host$request_uri;
}
如果是静态网页相关的配置,可以参考default.conf
:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Nginx更多的情况是用作反向代理:
server
{
listen 80;
server_name x.youclk.com;
location / {
proxy_pass http://x;
# Proxy Settings
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server
{
listen 80;
server_name y.youclk.com;
location / {
proxy_pass http://y;
}
}
3. 命令摘要
没啥好说的,不做特殊用途的话以下命令能够满足操作了:
service nginx {start|stop|status|restart|reload|configtest}
结语
本篇随笔可以说是Nginx的一些基本摘要,使用和原理方面都没有深入探究,后续如果使用到更高级功能或者有新的应用场景,再来继续补充内容。