1. Nginx基础

Nginx (“engine x”) 是一个高性能的 HTTP 、反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

截至2019年12月,差不多世界上每3个网站中就有1个使用Nginx。

用了nginx还需要网关么 nginx需要安装吗_Nginx


选择 Nginx 的理由:

  1. 在性能上:Nginx占用很少的系统资源,能支持高达5万的并发连接;
  2. 在功能上:Nginx是优秀的代理服务器、负载均衡服务器;
  3. 在安装配置上:Nginx安装简单、配置灵活,支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。

对于大多数使用者来说,Nginx只是一个静态文件服务器或者http请求转发器,它可以把静态文件的请求直接返回静态文件资源,把动态文件的请求转发给后台的处理程序。

Nginx作为HTTP 服务器,有以下特性:

  1. 处理静态文件,索引文件自动索引。
  2. 反向代理加速/负载均衡/容错。
  3. FastCGI,简单的负载均衡和容错。
  4. 模块化的结构。
  5. 支持 SSL 和 TLSSNI。

代理、反向代理:
https://www.zhihu.com/question/24723688/answer/128105528 正向代理隐藏真实客户端,反向代理隐藏真实服务端。

  1. 代理
    代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
  2. 用了nginx还需要网关么 nginx需要安装吗_Nginx_02

  3. 反向代理
    反向代理(Reverse Proxy)是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
  4. 用了nginx还需要网关么 nginx需要安装吗_服务器_03

Nginx在架构体系中的位置:

用了nginx还需要网关么 nginx需要安装吗_Nginx_04


Nginx在架构中的作用:

  1. 网关
    面向客户的总入口
  2. 虚拟主机
    为不同域名/ip/端口提供服务
  3. 路由
    使用反向代理,整合后面服务为一个完整业务
  4. 静态服务器
    mvvm模式中,用来发布html/css/js/img
  5. 负载集群
    使用upstream,负载多个tomcat

Nginx的模块化设计:

用了nginx还需要网关么 nginx需要安装吗_nginx_05

  1. 核心模块
    正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
  2. 标准 HTTP 模块
    提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
  3. 可选 HTTP 模块
    用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
  4. 邮件服务模块
    用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
  5. 第三方模块
    扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。

Nginx多进程模型:

用了nginx还需要网关么 nginx需要安装吗_服务器_06


Nginx 会按需同时运行多个进程:一个主进程(master)、几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)、缓存管理器进程(cache manager)等。

所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。worker、cache loader、cache manager 均应以非特权用户身份(user 配置项)运行。

master进程主要完成如下工作:

  1. 读取并验证配置信息
  2. 创建、绑定及关闭套接字
  3. 启动、终止及维护 worker 进程的个数
  4. 无须中止服务而重新配置工作特性
  5. 重新打开日志文件

worker进程主要完成的任务包括:

  1. 接收、传入并处理来自客户端的连接
  2. 提供反向代理及过滤功能
  3. nginx 任何能完成的其它任务

master主要管理worker进程,包含:

  1. 接收来自外界的信号,向各worker进程发送信号。
  2. 监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

服务器每当收到一个客户端连接时,就由服务器主进程(master process)生成一个子进程(worker process)和客户端建立连接,进行交互,直到连接断开,该子进程结束。

使用进程的好处是:

  1. 各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。
  2. 采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,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目录结构:

  1. conf:配置文件
  2. html:静态网页文件
  3. logs:日志文件
  4. sbin:二进制程序

nginx.conf配置文件结构:

用了nginx还需要网关么 nginx需要安装吗_服务器_07

  1. main:全局设置
  2. events:设定nginx的工作模式及连接数上限
  3. http:服务器相关属性
  4. server:虚拟主机设置
  5. upstream:上游服务器设置,主要为反向代理、负载均衡相关配置
  6. 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。

用了nginx还需要网关么 nginx需要安装吗_用了nginx还需要网关么_08


error_log:错误日志不支持自定义

用了nginx还需要网关么 nginx需要安装吗_用了nginx还需要网关么_09

# 常用日志格式
log_format main  '$remote_addr - $remote_user [stime_local] $request' '"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';

用了nginx还需要网关么 nginx需要安装吗_Nginx_10


配置日志切割:

  1. 编写自动分割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)
  1. 设置Linux定时任务
crontab -e

0 0 * * * root /usr/local/nginx/logs/ngx_log.sh

service crond restart

3. 配置虚拟主机

配置方式:

  1. 基于域名的虚拟主机
  2. 基于ip的虚拟主机
  3. 基于端口的虚拟主机

用了nginx还需要网关么 nginx需要安装吗_nginx_11

server {
	#监听端口 80
	listen 80;
	#监听域名abc.com;
	server_name abc.com;
	location / {
		# 根目录路径
		root abc;
		# 默认跳转到index.html页面
		index index.html;
	}
}