nginx环境搭建---1

Posted *King*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx环境搭建---1相关的知识,希望对你有一定的参考价值。

一、nginx在架构体系中发挥的作用

在这里插入图片描述

1、网关

面向客户的总入口

2、虚拟主机

为不同域名/ip/端口提供服务

3、路由

使用反向代理,整合后面服务为一个完整业务

4、静态服务器

mvvm模式中,用来发布html/css/js/img

5、负载集群

使用upstream,负载多个tomcat

二、Nginx的模块化设计

高度模块化的设计是nginx的架构基础,nginx服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,底耦合”的原则。
在这里插入图片描述

1、核心模块

正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。

2、标准HTTP模块

提供HTTP协议解析相关的功能,如:端口配置、网页编码设置、HTTP响应头设置等

3、可选HTTP模块

用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,如:Flash多媒体传输、解析GeoIp请求、SSL支持等。

4、邮件服务模块

用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持。

5、第三方模块

为了扩展Nginx服务器应用,完成开发者自定义功能,如:Json支持、Lua支持等。

三、Nginx多进程模型

在这里插入图片描述
1、服务器每当收到一个客户端时,就有服务器主进程(master process)生成一个子进程(worker process)出来和客户端建立连接进行交互,直到连接断开,该子进程结束。

2、使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成影响,同时降低编程的复杂度,降低开发成本。其次,采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master进程则很快启动新的worker进程,确保服务不中断,将风险降到最低。

缺点是操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的开销,当有大量请求时,会导致系统性能下降。

Nginx会按需同时运行多个进程

一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。 所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。 主进程以 root 用户身份运行,而 worker、cache loader 和 cache manager 均应以非特权用 户身份(user 配置项)运行。

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

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

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

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

四、Nginx的epoll模式

在这里插入图片描述

1、select和poll的处理模式如上图:

在某一时刻,进程收集所有的连接,其实这 100 万连接中大部分是没有事件发 生的。因此,如果每次收集事件时,都把这 100 万连接的套接字传给操作系统(这 首先就是用户态内存到内核内存的大量复制),而由操作系统内核寻找这些链接上没有处理的事件,将会是巨大的浪费。

而epoll改进了收集连接的动作,提高效率。

2、Epoll模式:

1、惊群(与epoll方式一样)
2、内核把事件写入Map,方便快速查找
–发生IO事件时,内核到Map中查找my_events

3、epoll的优点:

1、支持一个进程打开大数目的socket描述符(FD)

2、IO效率不随FD数目增加而线性下降

3、使用map加速内核与用户空间的消息传递

4、正向代理与反向代理

代理:意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始

服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服

务器转交请求并将获得的内容返回给客户端。

反向代理:服务端推出的一个代理招牌

五、Nginx安装配置

推存使用源码安装:配置方便,可以定制需要哪些模块或新增第三方模块

源码安装

1、cd进入对应目录下:

cd /usr/local/src/

2、把nginux-1.15.8.tar.gz源码包down下来

wget http://nginx.org/download/nginx-1.15.8.tar.gz

3、解压

tar -zxvf nginx-1.15.8.tar.gz

4、进入目录执行配置文件

cd nginx-1.15.8/
./configure 

如果报错,可能还需要安装一个c++的运行环境和nginx需要依赖的软件包

安装make:yum -y install autoconf automake make
安装g++: yum -y install gcc gcc-c++

yum -y install pcre pcre-devel    
yum -y install zlib zlib-devel
yum install -y openssl openssl-devel

5、编译

make
make install

安装完毕~~~

可查看一下nginx

whereis nginx

在这里插入图片描述

进入nginx安装目录

cd /usr/local/nginx

在这里插入图片描述

nginx目录结构

  • conf 配置文件

  • html 静态网页文件

  • logs 日志文件

  • sbin 二进制程序

nginx常用命令

./nginx -c nginx.conf 的文件。如果不指定,默认为 NGINX_HOME/conf/nginx.conf 
./nginx -s stop 停止 
./nginx -s quit 退出 
./nginx -s reload 重新加载 nginx.conf

6、环境变量的配置

在profile文件后面加上export PATH=$PATH:/usr/local/nginx/sbin/

vi /etc/profile

在这里插入图片描述

7、增加完后,把环境变量配置生效一下

source /etc/profile

8、启动nginx

nginx

在这里插入图片描述

六、Nginx常用命令

在这里插入图片描述

七、Nginx配置

nginx.conf配置文件:

#user nobody; #主模块命令, 指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行。 
worker_processes 1;#指定 Nginx 要开启的进程数。 
worker_rlimit_nofile 100000; #worker 进程的最大打开文件数限制 
#error_log logs/error.log; 
#error_log logs/error.log notice; 
#error_log logs/error.log info; 
#pid logs/nginx.pid; 
events { 
use epoll; 
worker_connections 1024; 
}
/* 
	以上这块配置代码是对 nginx 全局属性的配置。 
	user :主模块命令, 指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行。 
	worker_processes: 指定 Nginx 要开启的进程数。 
	error log:用来定义全局错设日志文件的路径和日志名称。 
		日志输出级别有 debug,info,notice,warn,error,crit 可供选择, 其中 debug 输出日志最为详细,面 crit(严重)输出日志最少。默认是 error 
	pid: 用来指定进程 id 的存储文件位置。 
	event:设定 nginx 的工作模式及连接数上限,其中参数 use 用来指定 nginx 的工作模式(这里是 epoll,epoll 是多路复用 IO(I/O Multiplexing)中的一种方式), 
		nginx 支持的工作模式有 select ,poll,kqueue,epoll,rtsig,/dev/poll。 其中 select 和 poll 都是标准的工作模式,kqueue 和 epoll 是高效的工作模式,对于 linux 系统,epoll 是首选。 
	worker_connection 是设置 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 日志的格式 
	# '$status $body_bytes_sent "$http_referer" ' 
	# '"$http_user_agent" "$http_x_forwarded_for"'; 
	#access_log logs/access.log main; 
	sendfile on; 开启高效文件传输模式(zero copy 方式),避免内核缓冲区 数据和用户缓冲区数据之间的拷贝。 
	#tcp_nopush on; 开启 TCP_NOPUSH 套接字(sendfile 开启时有用) 
	#keepalive_timeout 0; 客户端连接超时时间 
	keepalive_timeout 65; 
	#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 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; 
    } 
   }

八、Nginx日志

Nginx日志对于统计,系统服务排错很有用。

Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)

通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。

错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。

查看日志命令

tail -f /usr/local/nginx/logs/access.log

1、设置access_log

访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP、浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。具体要记录哪些信息,可以通过log_format指令定义。

语法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志
access_log off; # 关闭访问日志
  • path:指定日志的存放位置。
  • format:指定日志的格式。默认使用预定义的combined。
  • buffer:用来指定日志写入时的缓存大小,默认是64k。
  • gzip:日志写入前先进行压缩,压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
  • flush:设置缓存的有效时间,如果超过flush指定的时间,缓存中的内容将被清空。
  • if:条件判断,如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
  • 另外,还有一个特殊的值off。如果指定了该值,当前作用域下的所有的请求日志都被关闭

示例

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"';
					##日志格式使用默认的combined,指定日志的缓存大小为32k,日志写入前启用gzip进行压缩,压缩比使用默认值1,缓存数据有效时间为1分钟。
					access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m;
}

作用域

access_log指令的作用域分别有http,server,location。

2、log_format自定义格式

默认的日志格式

	log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
					'$status $body_bytes_sent "$http_referer" ' 
					'"$http_user_agent" "$http_x_forwarded_for"';

在这里插入图片描述

3、设置error_log

错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。

错误日志不支持自定义。

语法

error_log path [level];
  • path:参数指定日志的写入位置。
  • level:参数指定日志的级别(不写为全部)。level可以是是 debug, info, notice, warn, error, crit, alert,emerg 中的任意值(等级从低到高排列)

只有日志的错误级别等于或高于level指定的值才会写入错误日志中。默认是error。

示例

error_log logs/error.log;
error_log logs/error_notice.log  notice;
error_log logs/error_info.log  info;   ##可以将不同的错误类型分开存储

4、日志配置及切割

/etc/init.d/rsyslog start #系统日志,如不开启,看不到定时任务日志
/etc/rc.d/init.d/crond start #定时任务开启

1、编写shell:(按每天来切割日志)

#!/bin/bash 
#设置日志文件存放目录 
LOG_HOME="/usr/local/nginx/logs/" 
#备分文件名称 
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d)" 
#重命名日志文件 
mv ${LOG_HOME}/access.log ${LOG_HOME}/access.${LOG_PATH_BAK}.log 
mv ${LOG_HOME}/error.log ${LOG_HOME}/error.${LOG_PATH_BAK}.log 
#向 nginx 主进程发信号重新打开日志
kill -USR1 `cat ${LOG_HOME}/nginx.pid`

USR1信号:自定义信号,linux定义这个信号的解释权归进程程序本身,nginx解读USR1为重新起日志的信号。
在这里插入图片描述

2、设置Linux定时任务cron:

crontab -e
* * */1 * * /usr/local/nginx/sbin/logcut.sh

在这里插入图片描述

以上是关于nginx环境搭建---1的主要内容,如果未能解决你的问题,请参考以下文章

基于CentOS 6.8平台最新源代码包编译安装LNMP环境搭建(Nginx+MySQL+PHP)

搭建 LNMP 环境

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Nginx解析漏洞环境搭建及实战

linux+nginx+mysql+php环境的搭建

lnmp环境搭建脚本