简介
高性能的 HTTP 和反向代理服务器软件
架构
由内核 和 一系列模块组成
内核
提供 web 服务的基本功能 如启用网络协议、创建运行环境、接收和分配客户端请求、处理模块之间的交互
模块
从结构上分为核心模块、基础模块和第三方模块 核心模块: HTTP 模块、EVENT 模块和 MAIL 模块 基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块 第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块
安装
# 以centos为例
sudo yum install -y nginx
# 启动
sudo systemctl start nginx
# 检查配置文件 默认是/etc/nginx/nginx.conf
sudo nginx -t
守护进程
nginx 启动后 运行 守护进程
守护进程 由 一个 master 进程 和 若干个 worker进程 组成(这里worker进程的数量由配置文件中字段worker_processes映射的值决定)
master进程的工作:
读取并验证配置信息
创建、绑定及关闭套接字;
启动、终止 worker 进程及维护 worker 进程的个数;
无须中止服务而重新配置工作;
控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
重新打开日志文件;
编译嵌入式 Perl 脚本
worker进程主要完成如下工作:
接收、传入并处理来自客户端的连接
提供反向代理及过滤功能
nginx 任何能完成的其它任务
优化
主要通过设置/etc/nginx/nginx.conf来实现
顶层配置
# 主要是设置worker_processes字段的值 # 可以是设置为auto worker_processes auto; # 也可以根据查看本机的可运行内核数来判断 cat /proc/cpuinfo |grep processor
events配置
# 主要是设置events代码块worker_connections字段的值 # 这个值代表一个 worker 进程可以同时打开的链接数 # 默认是 events { worker_connections 1024; }
http配置
Basic Settings
sendfile指向 sendfile()函数。sendfile() 在磁盘和 TCP 端口(或者任意两个文件描述符)之间复制数据 tcp_nopush 配置 Nginx 在一个包中发送全部的头文件,而不是一个一个发送 tcp_nodelay 配置 Nginx 不要缓存数据,应该快速的发送小数据(这仅仅应该用于频繁发送小的碎片信息而无需立刻获取响应的,需要实时传递数据的应用中) keepalive_timeout 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。我们可以降低这个值,以避免让 worker 过长时间的忙碌。
logging setings
access_log 确定了 Nginx 是否保存访问日志。将这个设置为关闭可以降低磁盘 IO 而提升速度。 error_log 设置 Nginx 应当记录临界错误
Gzip settings
gzip 设置 nginx gzip 压缩发送的数据。这会减少需要发送的数据的数量 gzip_disable 为指定的客户端禁用 gzip 功能 gzip_proxied 允许或禁止基于请求、响应的压缩。设置为 any,就可以 gzip 所有的请求 gzip_comp_level 设置了数据压缩的等级。等级可以是 1-9 的任意一个值,9 表示最慢但是最高比例的压缩 gzip_types 设置进行 gzip 的类型
配置文件模板
# https://www.nginx.com/resources/wiki/start/topics/examples/full/
user www www; ## Default: nobody
worker_processes 5; ## Default: 1
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 8192;
events {
worker_connections 4096; ## Default: 1024
}
http {
include conf/mime.types;
include /etc/nginx/proxy.conf;
include /etc/nginx/fastcgi.conf;
index index.html index.htm index.php;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
server_names_hash_bucket_size 128; # this seems to be required for some vhosts
server { # php/fastcgi
listen 80;
server_name domain1.com www.domain1.com;
access_log logs/domain1.access.log main;
root html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:1025;
}
}
server { # simple reverse-proxy
listen 80;
server_name domain2.com www.domain2.com;
access_log logs/domain2.access.log main;
# serve static files
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/big.server.com/htdocs;
expires 30d;
}
# pass requests for dynamic content to rails/turbogears/zope, et al
location / {
proxy_pass http://127.0.0.1:8080;
}
}
upstream big_server_com {
server 127.0.0.3:8000 weight=5;
server 127.0.0.3:8001 weight=5;
server 192.168.0.1:8000;
server 192.168.0.1:8001;
}
server { # simple load balancing
listen 80;
server_name big.server.com;
access_log logs/big.server.access.log main;
location / {
proxy_pass http://big_server_com;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。