高度模块化的设计是 Nginx 的架构基础,Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则。
核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外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
- vi /etc/profile
-
- # 在最后一行加入
- export PATH=$PATH:/usr/local/nginx/sbin
-
- # 生效环境变量
- source /etc/profile
- systemctl status firewalld
- systemctl stop firewalld
- systemctl disable firewalld
因为需要通过虚拟主机配置我们需要配置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
默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址,因此可以如下执行命令添加源。
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- sudo yum install -y nginx
- # 启动
- sudo systemctl start nginx.service
- # 设置开机自动运行
- sudo systemctl enable nginx.service
- # 启动
- 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匹配特定位置的设置),每部分包含若干指令。
它们之间的关系是,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; #设置网路连接序列化,防止惊群现象发生,默认为on
- multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
- #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
- worker_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; #拒绝的ip
- allow 172.18.5.54; #允许的ip
- }
- }
- }
nginx配置为简化日常维护而设计,并且提供了简单的手段用于web服务器将来的扩展。
配置文件是一些文本文件,通常位于nginx安装路径/etc/nginx
或/etc/nginx
,主配置文件通常命名为nginx.conf
,为了保持整洁,部分配置可以放到单独的文件中,再自动地被包含到主配置文件,但应该注意的是,nginx目前不支持Apache风格的分布式配置文件(如.htaccess文件),所有和nginx行为相关的配置都应该位于一个集中的配置文件目录中。
- user nobody nobody;
- worker_processes 2;
- error_log logs/error.log notice;
- pid logs/nginx.pid;
-
- events{
- use epoll;
- worker_connections 65536;
- }
user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。
这个地方如果写错了就会出现获取不到用户的错误
是个主模块指令,指定了Nginx要开启的进程数,每个Nginx进程平均耗费10M~12M内存,建议指定和CPU的数量一致即可。
这个地方如果配置了
worker_processes 2;
那么他的工作进程就有两个
是个主模块指令,用来定义全局错误日志文件,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
日志文件路径一般在nginx安装目录的logs目录中
是个主模块指令,用来指定进程pid的存储文件位置。
进行成和nginx的master的进程号是一致的,只有nginx运行时才存在,如果nginx停止了 pid也会被删除掉
events事件指令是设定Nginx的工作模式及连接数上限:
use是个事件模块指令,用来指定Nginx的工作模式
Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选。
也是个事件模块指令,用于定义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的设置才能生效
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是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,可以将其他各个模块的具体配置分散在不同的文件夹中。
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
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"';