Nginx 模块
高度模块化的设计是 Nginx 的架构基础,Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。
核心模块
核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
标准 HTTP 模块
标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
可选 HTTP 模块
可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
邮件服务模块
邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
第三方模块
第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
nginx应用场景
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
正向代理与反向代理的区别,nginx主要是反向代理实现负载均衡。
Nginx的安装
编译安装nginx
# 安装make
yum -y install autoconf automake make
# 安装g++
yum -y install gcc gcc-c++
# 安装nginx依赖的库
yum -y install wget pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载nginx
wget http://nginx.org/download/nginx-1.23.0.tar.gz
# 解压nginx
tar -zxvf nginx-1.21.1.tar.gz# 编译安装
./configure --prefix=/usr/local/nginx
make && make install
编译配置
- –prefix指定安装目录
- –with-http_ssl_module安装https模块
- creating objs/Makefile 代表编译成功
- make编译
- make install安装
配置环境变量
vi /etc/profile# 在最后一行加入
export PATH=$PATH:/usr/local/nginx/sbin# 生效环境变量
source /etc/profile
关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
配置Hosts
因为需要通过虚拟主机配置我们需要配置hosts文件
192.168.245.198 www.abc.com
192.168.245.198 www.abc.cn
192.168.245.198 www.bbs.com
192.168.245.198 www.resources.com
192.168.245.198 www.ab.com
192.168.245.198 www.yyy.com
yum方式
添加源
默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址,因此可以如下执行命令添加源。
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装Nginx
sudo yum install -y nginx
# 启动
sudo systemctl start nginx.service
# 设置开机自动运行
sudo systemctl enable nginx.service
Nginx常用命令
# 启动
nginx
# 如果执行配置文件
nginx -c nginx.conf #如果不指定,默认为NGINX_HOME/conf/nginx.conf#停止
nginx -s stop#退出
nginx -s quit#关闭
# 查看nginx进程号
ps -aux | grep nginx# 杀掉进程
kill -9 nginx# 重新加载配置文件
nginx -s reload#检查配置文件是否正确
nginx -t -c /路径/nginx.conf#查看nginx的版本信息
nginx -v
配置文件结构
Nginx配置文件一般位于Nginx安装目录下的conf目录下,整个文件以block形式组合而成,每一个block都使用"{}"大括号来表示,block中可以嵌套其他block层级,其中main层是最高层次。
Nginx配置文件主要有4部分,main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理,负载均衡相关配置)和location(url匹配特定位置的设置),每部分包含若干指令。
- Main部分的设置影响其他所有部分的设置;
- Server部分主要用于指定虚拟机主机域名,ip和端口;
- Upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
- Location部分用于匹配网页位置(如,跟目录“/”,”/images”等)。
它们之间的关系是,server继承main,location继承server,upstream既不会继承指令也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。
真实的nginx配置文件可能如下
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为onmulti_accept on; #设置一个进程是否同时接受多个网络连接,默认为off#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections 1024; #最大连接数,默认为512
}
http {include mime.types; #文件扩展名与文件类型映射表default_type application/octet-stream; #默认文件类型,默认为text/plain#access_log off; #取消服务日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式access_log log/access.log myFormat; #combined为日志格式的默认值sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。upstream mysvr { server 127.0.0.1:7878;server 192.168.10.121:3333 backup; #热备}error_page 404 https://www.baidu.com; #错误页server {keepalive_requests 120; #单连接请求上限次数。listen 4545; #监听端口server_name 127.0.0.1; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。#root path; #根目录#index vv.txt; #设置默认页proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表deny 127.0.0.1; #拒绝的ipallow 172.18.5.54; #允许的ip } }
}
配置文件位置
nginx配置为简化日常维护而设计,并且提供了简单的手段用于web服务器将来的扩展。
配置文件是一些文本文件,通常位于nginx安装路径/etc/nginx
或/etc/nginx
,主配置文件通常命名为nginx.conf
,为了保持整洁,部分配置可以放到单独的文件中,再自动地被包含到主配置文件,但应该注意的是,nginx目前不支持Apache风格的分布式配置文件(如.htaccess文件),所有和nginx行为相关的配置都应该位于一个集中的配置文件目录中。
Nginx的全局配置
user nobody nobody;
worker_processes 2;
error_log logs/error.log notice;
pid logs/nginx.pid;events{use epoll;worker_connections 65536;
}
user
user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
这个地方如果写错了就会出现获取不到用户的错误
worker_processes
是个主模块指令,指定了Nginx要开启的进程数,每个Nginx进程平均耗费10M~12M内存,建议指定和CPU的数量一致即可。
这个地方如果配置了
worker_processes 2;
那么他的工作进程就有两个
error_log
是个主模块指令,用来定义全局错误日志文件,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
日志文件路径一般在nginx安装目录的logs目录中
pid
是个主模块指令,用来指定进程pid的存储文件位置。
进行成和nginx的master的进程号是一致的,只有nginx运行时才存在,如果nginx停止了 pid也会被删除掉
events事件指令
events事件指令是设定Nginx的工作模式及连接数上限:
use
use是个事件模块指令,用来指定Nginx的工作模式
Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选。
worker_connections
也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。
最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections
在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。 进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效
HTTP服务器配置
Nginx对HTTP服务器相关属性的配置代码如下:
http {# 引入文件类型映射文件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"';# 启动零拷贝提高性能sendfile on;# 设置keepalive长连接超时时间keepalive_timeout 65;# 引入子配置文件include /usr/local/openresty/nginx/conf/conf.d/*.conf;
}
下面的代码实现对日志格式的设定:下面详细介绍下这段代码中每个配置选项的含义。
include
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,可以将其他各个模块的具体配置分散在不同的文件夹中。
default_type
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
log_format
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';