Nginx概述
Nginx 概述
Nginx
是开源、高性能、高可靠的 Web
和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx
最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx
是免费的并可以商业化,配置使用也比较简单。
Nginx 特点
- 高并发、高性能;
- 模块化架构使得它的扩展性非常好;
- 异步非阻塞的事件驱动模型这点和
Node.js
相似; - 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性;
- 热部署、平滑升级;
- 完全开源,生态繁荣;
Nginx 作用
- 静态资源服务,通过本地文件系统提供服务;
- 反向代理服务,延伸出包括缓存、负载均衡等;
API
服务,OpenResty
;
Nginx
擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等)
Nginx 安装
本文演示的是 Linux
centOS 7.x
的操作系统上安装 Nginx。
使用 yum
安装 Nginx
:
yum install nginx -y
安装完成后,通过 rpm \-ql nginx
命令查看 Nginx
的安装信息:
# Nginx配置文件 /etc/nginx/nginx.conf # nginx 主配置文件 /etc/nginx/nginx.conf.default # 可执行程序文件 /usr/bin/nginx-upgrade /usr/sbin/nginx # nginx库文件 /usr/lib/systemd/system/nginx.service # 用于配置系统守护进程 /usr/lib64/nginx/modules # Nginx模块目录 # 帮助文档 /usr/share/doc/nginx-1.16.1 /usr/share/doc/nginx-1.16.1/CHANGES /usr/share/doc/nginx-1.16.1/README /usr/share/doc/nginx-1.16.1/README.dynamic /usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10 # 静态资源目录 /usr/share/nginx/html/404.html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html # 存放Nginx日志文件 /var/log/nginx
主要关注的文件夹有两个:
/etc/nginx/conf.d/
是子配置项存放处,/etc/nginx/nginx.conf
主配置文件会默认把这个文件夹中所有子配置项都引入;/usr/share/nginx/html/
静态文件都放在这个文件夹,也可以根据你自己的习惯放在其他地方;
Nginx 常用命令
# 开机配置 systemctl enable nginx # 开机自动启动 systemctl disable nginx # 关闭开机自动启动 # 启动Nginx systemctl start nginx # 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认页面 # 停止Nginx systemctl stop nginx # 重启Nginx systemctl restart nginx # 重新加载Nginx systemctl reload nginx # 查看 Nginx 运行状态 systemctl status nginx # 查看Nginx进程 ps -ef | grep nginx # 杀死Nginx进程 kill -9 pid # 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程
Nginx
应用程序命令:
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启 nginx -s reopen # 重启 Nginx nginx -s stop # 快速关闭 nginx -s quit # 等待工作进程处理完成后关闭 nginx -T # 查看当前 Nginx 最终的配置 nginx -t # 检查配置是否有问题
Nginx 核心配置
配置文件结构
Nginx
的典型配置示例:
# main段配置信息 user nginx; # 运行用户,默认即是nginx,可以不进行设置 worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样 error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录 pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置 # events段配置信息 events { use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的) worker_connections 1024; # 每个进程允许最大并发数 } # http段配置信息 # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置 http { # 设置日志模式 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; # Nginx访问日志存放位置 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; # 加载子配置项 # server段配置信息 server { listen 80; # 配置监听的端口 server_name localhost; # 配置的域名 # location段配置信息 location / { root /usr/share/nginx/html; # 网站根目录 index index.html index.htm; # 默认首页文件 deny 172.168.22.11; # 禁止访问的ip地址,可以为all allow 172.168.33.44;# 允许访问的ip地址,可以为all } error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面 error_page 400 404 error.html; # 同上 } }
main
全局配置,对全局生效;events
配置影响Nginx
服务器与用户的网络连接;http
配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;server
配置虚拟主机的相关参数,一个http
块中可以有多个server
块;location
用于配置匹配的uri
;upstream
配置后端服务器具体地址,负载均衡配置不可或缺的部分;
用一张图清晰的展示它的层级结构:
配置文件 main 段核心参数
user
指定运行 Nginx
的 woker
子进程的属主和属组,其中组可以不指定。
user USERNAME [GROUP]
user nginx lion; # 用户是nginx;组是lion
pid
指定运行 Nginx
master
主进程的 pid
文件存放路径。
pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件
worker_rlimit_nofile_number
指定 worker
子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。
worker_rlimit_core
指定 worker
子进程异常终止后的 core
文件,用于记录分析问题。
worker_rlimit_core 50M; # 存放大小限制
working_directory /opt/nginx/tmp; # 存放目录
worker_processes_number
指定 Nginx
启动的 worker
子进程数量。
worker_processes 4; # 指定具体子进程数量
worker_processes auto; # 与当前cpu物理核心数一致
worker_cpu_affinity
将每个 worker
子进程与我们的 cpu
物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程
将每个 worker
子进程与特定 CPU
物理核心绑定,优势在于,避免同一个 worker
子进程在不同的 CPU
核心上切换,缓存失效,降低性能。但其并不能真正的避免进程切换。
worker_priority
指定 worker
子进程的 nice
值,以调整运行 Nginx
的优先级,通常设定为负值,以优先调用 Nginx
。
worker_priority -10; # 120-10=110,110就是最终的优先级
Linux
默认进程的优先级值是120,值越小越优先; nice
定范围为 -20
到 +19
。
应用的默认优先级值是120加上 nice
值等于它最终的值,这个值越小,优先级越高。
worker_shutdown_timeout
指定 worker
子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
timer_resolution
worker
子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
在 Linux
系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
daemon
指定 Nginx
的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; # 默认是on,后台运行模式
配置文件 events 段核心参数
use
Nginx
使用何种事件驱动模型。
use method; # 不推荐配置它,让nginx自己选择
method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections
worker
子进程能够处理的最大并发连接数。
worker_connections 1024 # 每个子进程的最大连接数为1024
accept_mutex
是否打开负载均衡互斥锁。
accept_mutex on # 默认是off关闭的,这里推荐打
server_name 指令
指定虚拟主机域名。
server_name name1 name2 name3
# 示例:
server_name www.nginx.com;
域名匹配的四种写法:
- 精确匹配:
server_name www.nginx.com
; - 左侧通配:
server_name *.nginx.com
; - 右侧统配:
server_name www.nginx.*
; - 正则匹配:
server_name ~^www\.nginx\.*$
;