后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0
文章目录
nginx 介绍
Nginx(发音同engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。Nginx 是一款免费的开源软件,根据类 BSD 许可证的条款发布。一大部分Web服务器使用 Nginx ,通常作为负载均衡器。
nginx 特点
- 更快:
- 单次请求会得到更快的响应。
- 在高并发环境下,Nginx 比其他 WEB 服务器有更快的响应。
- 高扩展性:
- Nginx 是基于模块化设计,由多个耦合度极低的模块组成,因此具有很高的扩展性。许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
- 高可靠性:
- Nginx 的可靠性来自于其核心框架代码的优秀设计,模块设计的简单性。另外,官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在一个 worker 进程出错时可以快速拉起新的 worker 子进程提供服务。
- 低内存消耗:
- 一般情况下,10000个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗 2.5MB 的内存,这是 Nginx 支持高并发连接的基础。
- 单机支持10万以上的并发连接:理论上,Nginx 支持的并发连接上限取决于内存,10万远未封顶。
- 热部署:
- master 进程与 worker 进程的分离设计,使得 Nginx 能够提供热部署功能,即在 7x24 小时不间断服务的前提下,升级 Nginx 的可执行文件。当然,它也支持不停止服务就更新配置项,更换日志文件等功能。
- 最自由的 BSD 许可协议:
- 这是 Nginx 可以快速发展的强大动力。BSD 许可协议不只是允许用户免费使用 Nginx ,它还允许用户在自己的项目中直接使用或修改 Nginx 源码,然后发布
nginx 架构
nginx性能高,而nginx的高性能与其架构是分不开的。
nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉后台模式,让nginx在前台运行,并且通过配置让nginx取消master进程,从而可以使nginx以单进程方式运行。很显然,生产环境下我们肯定不会这么做,所以关闭后台模式,一般是用来调试用的。所以,我们可以看到,nginx是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。nginx采用多进程的方式有诸多好处,所以我就主要讲解nginx的多进程模式吧。
刚才讲到,nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。nginx的进程模型,可以由下图来表示:
代理
代理是什么呢? 见下图:
而代理分为正向代理和反向代理。
区别
- 正向代理的代理对象是用户
- 反向代理的代理对象为服务器
可以这样记忆, 正向代理客户端(VPN), 反向代理服务器。
正向代理
正向代理比如VPN,安装在客户端的软件,任何可以被该VPN访问的网址就都可以被客户端用户访问,正向代理只对客户端负责。
场景: 由于公司换云平台,必然出口ip也会变,对接的有些合作公司需要添加新的ip白名单,但有些公司申请ip白名单添加流程比较长,所以需要在新云平台的服务器做正向代理以达到通过原来公司的出口ip出去的目的,这样的话在合作公司白名单ip申请期间服务也可以正常使用而不影响业务。
反向代理
代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过 HTTP以外的协议将请求传递给应用服务器。
场景: 负载均衡。
config 配置文件
nginx 提供服务时,几乎80%情况都是可以通过配置文件来完成的,所以掌握配置文件如何配置,有助于实现个人或者企业快速完成功能的上线。
下面将会讲解nginx 配置文件架构、主要的字段及后面放上了我自定义的mini版的conf文件和nginx默认的conf文件。
配置文件架构
下图是nginx配置文件结构图:
从图中可看出主要包含三大块
- 全局块
- event块
- http块
http块包含:http 全局块和 server块
server块包含:server全局块和location块
主要字段讲解
用户组配置
格式 user user [group
user : 指定nginx 运行的用户
group: 指定nginx可运行的组
如果配置为user nobody nobody
, 则所有用户都能启动nginx进程。
worker 进程数配置
worker_processer number
number: nginx 最多可以产生的work process 数量
如果设置auto
, 则nginx将进行自动检测
设置好之后,可通过ps -ef | grep nginx
查看进程的启动情况
error 日志路径配置
error_log file [日志级别]
file : 指定输出到某个文件
日志级别:info、debug 、warn、error…
连接超时配置
keepalive_timeout timeout [header_timeout]
timeout : 表示server端对连接的保持时间
header_timeout: 表示在应答报文头部的Keep-Alive 域设置超时时间,为可选项
sendfile 设置
sendfile on
sendfile设置用户开启或者关闭使用sendfile() 系统调用来传输文件,默认off
在很多webserver 中,都引入了sendfile 机制,来实现高性能文件传输
…
mini.conf 讲解
mini版本配置详解
# nginx 进程数量(多进程模式)
worker_processes 4;
events {
# 表示允许nginx每一个work进程可以同时开启的最大连接数
worker_connections 1024;
}
# http 模块
http {
# server 模块
server {
# 监听9000 端口上所有ip 的连接
listen 9000;
# listen ip:9000 # 监听指定ip和端口上的连接
# listen ip # 监听指定ip上所有端口连接
# location 块 格式为 root path;
# path: 表示nginx接收到请求后查找资源的根目录路径 ; 也可根据 alias命令改变接收到uri请求路径,和shell中类似
location /images/ {
root /usr/local/nginx/;
}
# location 中也可以使用正则表达式
location ~ \.(mp3|mp4) {
root /xx/xx/xx/xx/;
}
}
# 监听其他端口
server {
listen 9001;
}
server {
listen 9002;
}
server {
listen 9003;
}
}
nginx.conf 讲解
默认配置文件参数详解
# user user [group]:不配置或配置成nobody,则默认所有用户都可启动nginx
# user 指定可以运行的nginx用户
# group: 指定可以运行的nginx用户组(可选)
# user nobody;
# nginx 进程数量(多进程模式)
worker_processes 1;
# error_log file [日志级别]
# file : 表示输出到某个文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid file
# 该选项用于自定义配置pid文件的保存路径, 不指定则默认 logs/nginx.pid
#pid logs/nginx.pid;
# event 模块
events {
# 每个work进程可以同时开启最大连接数
worker_connections 1024;
}
http {
# mime.types 表示网络资源的某体类型,就是前段请求资源类型,具体可看mime文件
include 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 path [format]
# path : 自定义访问日志的路径 + 名称
# [format] : 自定义服务日志的格式(可选)
#access_log logs/access.log main;
# 表示开启或关闭使用sendfile 系统调用来传输文件,默认off
# 但在很多webserver 中是开启的,来保证文件的高性能传输
# sendfile 是linux 2.0+ 推出的一个系统调用,被称为零拷贝,没有用户间的拷贝
sendfile on;
# 当使用sendfile 函数,tcp_nopush 才起作用,是tcp协议栈中的知识点
# 当tcp_nopush = on 时,会调用tcp_cork 方法,是默认的,就是收到的数据报不会立即发送出去,而是等到数据报最大时,一次性传输出去,有利于解决网络堵塞。
#tcp_nopush on;
# 客户端连接超时时间
# = 0 : 表示禁用长连接。
# = x :表示长连接timeout
#keepalive_timeout 0;
keepalive_timeout 65;
# 资源开启gzip 压缩, 这个需要看文件类型的, 要考虑压缩也是需耗费cpu资源的
# 二进制的资源(图片、mp3 二进制文件): 不必压缩
#gzip on;
server {
# 网络地址监听, 在mini.conf 有说明
listen 80;
# server_name name1 name2 ...
# name 可有多个并列名称,此处也支持正则表达式书写
# 也可配置 server_name ip地址
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# mini.conf 有说明
location / {
root html;
# index index_file : index_file 可包含多个用空格隔开的文件名,首先找到哪个页面就是哪个页面响应
index index.html index.htm;
}
# 使用自定义模块
location /test {
# 自定义模块写的关键词
count;
}
#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 html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
最后我制作了一个里面包含了我学习nginx的一个镜像, 现在你们只需要执行下面命令就能拉取学习需要的环境了
docker pull registry.cn-hangzhou.aliyuncs.com/aclj/nginx:1.0.1
如果需要项目环境源代码,可以参考此github, 后续可根据需求增加东西,欢迎star~