1. Nginx基础
Nginx (“engine x”) 是一个高性能的 HTTP 、反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
截至2019年12月,差不多世界上每3个网站中就有1个使用Nginx。
选择 Nginx 的理由:
- 在性能上:Nginx占用很少的系统资源,能支持高达5万的并发连接;
- 在功能上:Nginx是优秀的代理服务器、负载均衡服务器;
- 在安装配置上:Nginx安装简单、配置灵活,支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。
对于大多数使用者来说,Nginx只是一个静态文件服务器或者http请求转发器,它可以把静态文件的请求直接返回静态文件资源,把动态文件的请求转发给后台的处理程序。
Nginx作为HTTP 服务器,有以下特性:
- 处理静态文件,索引文件自动索引。
- 反向代理加速/负载均衡/容错。
- FastCGI,简单的负载均衡和容错。
- 模块化的结构。
- 支持 SSL 和 TLSSNI。
代理、反向代理:
https://www.zhihu.com/question/24723688/answer/128105528 正向代理隐藏真实客户端,反向代理隐藏真实服务端。
- 代理
代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。 - 反向代理
反向代理(Reverse Proxy)是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
Nginx在架构体系中的位置:
Nginx在架构中的作用:
- 网关
面向客户的总入口 - 虚拟主机
为不同域名/ip/端口提供服务 - 路由
使用反向代理,整合后面服务为一个完整业务 - 静态服务器
mvvm模式中,用来发布html/css/js/img - 负载集群
使用upstream,负载多个tomcat
Nginx的模块化设计:
- 核心模块
正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。 - 标准 HTTP 模块
提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。 - 可选 HTTP 模块
用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。 - 邮件服务模块
用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。 - 第三方模块
扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
Nginx多进程模型:
Nginx 会按需同时运行多个进程:一个主进程(master)、几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)、缓存管理器进程(cache manager)等。
所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。worker、cache loader、cache manager 均应以非特权用户身份(user 配置项)运行。
master进程主要完成如下工作:
- 读取并验证配置信息
- 创建、绑定及关闭套接字
- 启动、终止及维护 worker 进程的个数
- 无须中止服务而重新配置工作特性
- 重新打开日志文件
worker进程主要完成的任务包括:
- 接收、传入并处理来自客户端的连接
- 提供反向代理及过滤功能
- nginx 任何能完成的其它任务
master主要管理worker进程,包含:
- 接收来自外界的信号,向各worker进程发送信号。
- 监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
服务器每当收到一个客户端连接时,就由服务器主进程(master process)生成一个子进程(worker process)和客户端建立连接,进行交互,直到连接断开,该子进程结束。
使用进程的好处是:
- 各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。
- 采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程将很快启动新的 worker 进程,确保服务不中断,将风险降到最低。
使用进程的缺点是:操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定
的开销;当有大量请求时,会导致系统性能下降。
2. Nginx安装
提前安装依赖
yum -y install autoconf automake make # 安装make
yum -y install gcc gcc-c++ # 安装c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel
wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar -zxvf nginx-1.15.8.tar.gz
cd nginx-1.15.8
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module # with是添加可选HTTP模块
make && make install
export PATH=$PATH:/usr/local/nginx/sbin/
Nginx常用命令:
./nginx -c nginx.conf # 启动,如果不指定配置文件,默认为 NGINX_HOME/conf/nginx.conf
./nginx -s stop # 停止
./nginx -s quit # 退出
./nginx -s reload # 重新加载 nginx.conf
Nginx目录结构:
- conf:配置文件
- html:静态网页文件
- logs:日志文件
- sbin:二进制程序
nginx.conf配置文件结构:
- main:全局设置
- events:设定nginx的工作模式及连接数上限
- http:服务器相关属性
- server:虚拟主机设置
- upstream:上游服务器设置,主要为反向代理、负载均衡相关配置
- location:URL匹配特定位置后的设置
## 以下这块配置代码是对 nginx 全局属性的配置
#user nobody; # 指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行
worker_processes 1; # 指定 Nginx 要开启的进程数
worker_rlimit_nofile 100000; # worker 进程的最大打开文件数限制
#error_log logs/error.log; # 定义全局错误日志文件的路径和日志名称。日志输出级别有 debug、info、notice、warn、error、crit,默认是 error
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # 指定进程 id 的存储文件位置
events {
use epoll; # 指定 nginx 的工作模式。nginx 支持的工作模式有 select、poll、kqueue、epoll、rtsig、/dev/poll
worker_connections 1024; # 设置 nginx 每个进程最大的连接数,默认是 1024,所以 nginx 最大的连接数 max_client = worker_processes * worker_connections。进程最大连接数受到系统最大打开文件数的限制,需要设置 ulimit
}
## 下面是 nginx 对 http 服务器相关属性的设置
http {
include mime.types; # 对配置文件所包含文件的设定,减少主配置文件的复杂度,相当于把部分配置放在别的地方,再包含进来,保持主 配置文件的简洁
default_type application/octet-stream; # 默认文件类型,当文件类型未定义时就使用这类设置的
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '; # 指定 nginx 日志格式
#access_log logs/access.log main;
sendfile on; # 开启高效文件传输模式(zero copy方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。
#tcp_nopush on; # 开启 TCP_NOPUSH 套接字(sendfile 开启时有用)
#keepalive_timeout 0; # 客户端连接超时时间
#gzip on; # 是否开启 gzip 模块
## 下面是 server 段虚拟主机的配置
server {
listen 80; # 虚拟主机的服务端口
server_name localhost; # 指定 ip 或者域名,多个域名用逗号分开
#charset koi8-r;
location / {
#地址匹配设置,支持正则匹配,也支持条件匹配,这里是默认请求地址,可以用location命令对 nginx 进行动态和静态网页过滤处理
root html; # 虚拟主机的网页根目录
index index.html index.htm; # 默认访问首页文件
}
error_page 500 502 503 504 /50x.html; # redirect server error pages to the static page /50x.html
location = /50x.html {
root html;
}
}
}
Nginx日志:
Nginx 日志主要分为两种:access_log(访问日志)、 error_log(错误日志)
access_log:access_log 指令的作用域有 http、server、location。
error_log:错误日志不支持自定义
# 常用日志格式
log_format main '$remote_addr - $remote_user [stime_local] $request' '"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';
配置日志切割:
- 编写自动分割Nginx日志脚本
#!/bin/bash
#设置日志文件存放目录
LOGS_PATH=/usr/local/nginx/logs
#备份文件名称
YESTERDAY=$(date -d "yesterday" +%Y%m%d%H%M)
#重命名日志文件
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
# 向 Nginx 主进程发送 USR1 信号,Nginx处理 USR1 信号为重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
- 设置Linux定时任务
crontab -e
0 0 * * * root /usr/local/nginx/logs/ngx_log.sh
service crond restart
3. 配置虚拟主机
配置方式:
- 基于域名的虚拟主机
- 基于ip的虚拟主机
- 基于端口的虚拟主机
server {
#监听端口 80
listen 80;
#监听域名abc.com;
server_name abc.com;
location / {
# 根目录路径
root abc;
# 默认跳转到index.html页面
index index.html;
}
}