一、nginx服务基础
1.1 Nginx****简介
**高性能、轻量级 Web 服务软件;****稳定性高;**系统资源消耗低;
对HTTP 并发连接的处理能力高**(单台物理服务器可支持30 000~50 000个并发请求)**
Nginx 并发 连接能力 受2个因素影响:1、CPU 个数 ;2、本地物理服务器系统的最大打开文件数
(本机系统内核打开文件数:1024-65535 )
nginx 程序 端口号 80
Nginx ("engine x") 是一个 高性能 的 HTTP 和反向代理服务器。 Nginx 是由 Igor Sysoev 为俄
罗斯访问点开量第二的 Rambler.ru 站发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年 6 月 1 日, Nginx 1.0.4 发布。 1.18 1.20 1.22 1.12
Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件( IMAP/POP3 )代理服务器,
单台物理服务器 可支持 30 000 ~ 50 000 个并发请求(最多5万个人同时请求) 。并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler (俄文: Рамблер )使用。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国 大陆使用 Nginx 网站用户有:百度 BWS 、新浪、网易、腾讯、等。
正向代理 :Nginx 代理客户端 ,客户端通过正向代理服务器 访问外部网络资源
反向代理 :Nginx 代理服务端,它 接收客户端的请求,并将请求转发给后端服务器。客户端并不直接与后端服务器通信,而是与反向代理通信。可以隐藏后端服务器的真实 IP 地址,并帮助保护后端服务的安全
Nginx 官网:
RamBler : http://www.rambler.ru/
nginx: http://nginx.org/
Mainline version 主线版本
Stable version
稳定版本
旧版本下载: http://mirrors.sohu.com/nginx/
Nginx 中文参考地址 : http://www.nginx.cn/doc/
淘宝 web
Tengine :
Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,
添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网、天猫商城等得到了很好的检验。(可以这样理解:淘宝网拿到了 Nginx 源代码之后,进行了功能的填充、优化等等,然后提交给Nginx 官方,但是由于 Nginx 官方相应慢甚至不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循 GPL 的原则上进行二次开发,于是就出了现在的 Tengine 这个版本)
官网网站: http://tengine.taobao.org/
1.2 Nginx 功能介绍
静态的 web 资源服务器 html ,图片, js , css , txt 等静态资源
http/https 协议的反向代理 , 7 层 url
结合 FastCGI /uWSGI/SCGI 等协议反向代理动态资源请求
tcp/udp 协议的请求转发(反向代理) 4 层
1.3****基础特性
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗: 10000 个 keep-alive 连接模式下的非活动连接,仅需 2.5M 内存
event-driven, aio, mmap , sendfile
1.4 Web****服务相关的功能
虚拟主机( server )
支持 keep-alive 和管道连接 ( 利用一个连接做多次请求 )
访问日志(支持基于日志缓冲提高其性能)
url rewirte (把 一个网站 重定向到 另一个网站)
路径别名 (URL 别名)
基于 IP 及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程 (平滑升级)
https://www.jianshu.com/p/a0770dd6df0e
https://blog.csdn.net/Lzcsfg/article/details/139869821
1.5 nginx****应用场景
① 静态服务器 (可以高效地处理和分发静态内容,如 图片、视频服务、文本)
② 动态服务 (通过与后端应用服务器配合使用,通过反向代理的方式提供动态内容服务)
③ 反向代理(作为反向代理服务器,将客户端请求转发到后端服务器上 )
负载均衡(当有多台后端服务器时,Nginx 可以将请求分发到不同的服务器上,以实现负载均衡 )
④缓存服务(Nginx 可以作为 HTTP 缓存服务器,缓存静态文件或动态内容,从而减轻后端服务器的压力并加快响应速度 )
nginx 中 http 七层代理和四层代理
web 服务器
做:代理 服务器
反向代理, 负载均衡
1.6Nginx和Apache的差异
Nginx 位于七层和四层(应用层、传输层);Apache 位于七层(应用层)
Nginx通过反向代理连接 PHP ;Apache 直接连接 PHP
Nginx 是一个甚于事件的 Web 服务器, Apache 是一个基于流程的服务器 ;
Nginx 避免子进程的概念, Apache 是基于子进程的 ;
Nginx 在内存消耗和连接方面更好, Apache 在内存消耗和连接方面一般 ;
Nginx 的性能和可伸缩性不依赖于硬件(如:并发量50000可缩成20000), Apache 依赖于 CPU 和内存等硬件 ;
Nginx 支持热部署, Apache 不支持热部署 ;
Nginx 对于静态文件处理具有更高效率, Apache 相对一般 ;
Nginx 在反向代理场景具有明显优势, Apache 相对一般。
1.7 Nginx相对于Apache****的优点
轻量级,同样是 web 服务,比 Apache 占用更少的内存及资源 ;高并发, Nginx 处理请求是**异步非阻塞(**同时接受很多请求,不阻塞,一个操作开始后,程序不需要等待这个操作完成就可以继续做其他事情 )的,而 Apache 则是阻塞型的,在高并发下 Nginx 能保持低资源低消耗高性能;高度模块化的设计编写模块相对简单;社区活跃,各种高性能模块出品迅速。
Apache相对于Nginx****的优点:
rewrite ,比 Nginx 的 rewrite 强大;模块超多,基本想到的都可以找到;少 bug , Nginx 的 bug
相对较多;超稳定
存在就是理由,一般来说, 需要性能的 web 服务,用 Nginx 。如果 不需要性能只求稳定,那就Apache 。 Nginx 处理动态请求是弱项,一般 动态请求要 Apache 去做, Nginx 只适合静态和反向 。
1.8 Nginx****架构
上图是 Nginx 的进程模型,下面我们会简单讲解图中不同部分的含义:
既然 worker 进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供 80 端口的 http服务时,一个连接请求过来,每个进程都有可能处理这个连接。那么问题来了,到底最后怎样处理,是由什么决定的呢?我们来看一看一个完整的请求是怎样通过互相的协作来实现的:
( 1 )首先,每个 worker 进程都是从 master 进程 fork 过来,在 master 进程里面,先建立好需要listen 的 **socket ( listenfd ) ** 之后,然后再 fork 出多个 worker 进程。
( 2 )所有 worker 进程的 listenfd 会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker 进程会在注册 listenfd 读事件前抢 accept_mutex ,抢到互斥锁的那个进程注册 listenfd读事件,然后在读事件里调用 accept 接受该连接。(解决惊群)
( 3 )当一个 worker 进程在 accept 这个连接之后,就开始读取请求、解析请求、处理请求。产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
我们可以看到:一个请求,完全由 worker 进程来处理,而且只在一个 worker 进程中处理。
也许你还有个疑问,那就是 Nginx 采用多 worker 的方式来处理请求,每个 worker 里面只有一个主线程,那能够处理的并发数很有限啊,多少个 worker 就能处理多少个并发,何来高并发呢?
这就是 Nginx 的高明之处,Nginx 采用了 异步非阻塞 的方式来处理请求,也就是说, Nginx 是可以同时处理成千上万个请求的。
这里补充一下异步非阻塞的概念:
异步的概念是和同步相对的,也就是不同事件之间不是同时发生的。
非阻塞的概念是和阻塞对应的, 阻塞是事件按顺序执行 ,每一事件都要等待上一事件的完成,而非阻塞 是如果事件没有准备好,这个事件可以直接返回,过一段时间再进行处理询问,这期间可以做其他事情。(一个操作开始后,程序不需要等待这个操作完成就可以继续做其他事情)
有点类似协程
socket(套接字): ip+端口号
1.9 Nginx****进程结构
web请求处理机制
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直
到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务
器资源耗尽而无法提供请求。
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客
户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了 web 服务器
对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可
以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作
了, IIS 服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
工作进程( worker process )的功能:
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker 进程数量: 一般设置为核心数,充分利用 CPU 资源,同时避免进程数量过多,导致进程竞争 CPU 资源,(4核,最多4个进程)
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O 调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引(类似 目录),查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序(Nginx程序(应用))指令,比如重启、升级和退出等
Master创建文件的快捷方式,再fork多个子进程,把子进程变成读的状态,让所有的work进程注册到事件,让work进程去处理事件
1.10 nginx****模块 *
-核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
-标准 HTTP 模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP 响应头设置 等等
-可选 HTTP 模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
-邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP 协议的支持
-Stream服务模块 : 实现反向代理功能 , 包括 TCP 协议代理 四层
-第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
nginx高度模块化,但其模块早期不支持 DSO 机制 ;1.9.11 版本支持动态装载和卸载
常用模块
ngx_http_core_module 核心模块
ngx_http_access_module 访问控制
ngx_http_auth_basic_module 身份验证
ngx_http_gzip_module 压缩模块
ngx_http_log_module 日志模块
ngx_http_proxy_module 代理模块
ngx_http_rewrite_module 重写模块
ngx_http_stub_status_module 状态页模块
ngx_http_upstream_module 反向代理
ngx_http_stream_module 四层代理
核心模块: core module
标准模块:
HTTP 模块: ngx_http_* HTTPS模块(ssl)
HTTP Core modules # 默认功能
HTTP Optional modules # 需编译时指定
Mail 模块 : ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
二、编译安装****nginx 服务
(一般都是编译安装,不用yum)
2.0****扩展 在线 yum 安装nginx
1 、 yum 部署 Nginx
①使用 yum 部署 Nginx 需要先安装 epel-release 扩展包,官方源默认没有 Nginx 的 yum 源。
yum install epel-release -y #安装 epel-release 扩展源
②扩展源安装完后直接安装 Nginx 。
yum install nginx -y # 安装 nginx 服务
③使用 yum 安装的 nginx 配置文件位置在: /etc/nginx.conf
默认根目录在: /usr/share/nginx/html
默认日志文件在: /var/log/nginx/
2.1 nginx****编译安装 *
虚拟机设置 2核4G 就行
关闭防火墙,将 安装 nginx 所需软件包 传到 /opt 目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
下载安装包: nginx-1.12.0.tar.gz
在这里可以想下载你的安装包 https://nginx.org/download/nginx-1.18.0.tar.gz
wget https://nginx.org/download/nginx-1.18.0.tar.gz
https://nginx.org/download/nginx-1.20.1.tar.gz
2.2安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库 和头文件。
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2.3****创建运行用户与组
创建运行用户、组( Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
[root@localhost opt]# useradd -M -s /sbin/nologin nginx
[root@localhost opt]# tail /etc/passwd
nginx:x:1001:1001::/home/nginx:/sbin/nologin
2.4编译安装Nginx
nginx 1.12.0 版本
[root@localhost~]# cd /opt
[root@localhost opt]# tar zxvf nginx-1.12.0.tar.gz -C /opt/
[root@localhost nginx-1.12.2]# cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \ # 指定 nginx 的安装路径
--user=nginx \ # 指定用户名
--group=nginx \ # 指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计操作 VTS
[root@localhost nginx-1.12.2]# cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
[root@localhost nginx-1.12.2]# make && make install
安装 nginx 1.18.0版本
[root@localhost~]# tar zxvf nginx-1.18.0.tar.gz -C /opt/
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
./configure --help查看帮助模块
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
2、给 nginx 权限
[root@localhost nginx]# cd /usr/local/nginx/
[root@localhost nginx]# chown -R nginx.nginx /usr/local/nginx/
[root@localhost nginx]# ll
总用量 4
drwxr-xr-x. 2 nginx nginx 4096 8月 9 15:17 conf
drwxr-xr-x. 2 nginx nginx 40 8月 9 15:17 html
drwxr-xr-x. 2 nginx nginx 6 8月 9 15:17 logs
drwxr-xr-x. 2 nginx nginx 19 8月 9 15:17 sbin
此时可以查看 nginx版本
[root@localhost ~]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ls
nginx
[root@localhost sbin]# ./nginx -V #查看nginx版本
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
3、配置软链接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ # 让系统识别 nginx 的操作命令启动 检查
nginx -t # 检查配置文件是否配置正确启动
2.5 Nginx****信号
nginx 命令支持向其发送信号,实现不同功能
nginx 当做单独命令使用有以下选项
[root@node2 ~]#nginx -h
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen , reload
-p prefix : set prefix path (default: /etc/nginx/)
-e filename : set error log file (default: /var/log/nginx/error.log)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file
nginx -t 检查语法
nginx -T 检查语法 并打印所有配置
nginx -v 显示版本
nginx -V 显示详细信息, 包括 编译的信息
nginx -c 指定配置文件启动
nginx -s = kill 发送信号
nginx -s relaod 重新加载配置文件
nginx -s stop 停止 nginx 立即停止
nginx -s quit 优雅的退出 , 如果有人在访问我的服务, 那么不会立即关闭, 等客户断
开连接再 退出
nginx -s reopen 重新生成日志文件 USR1 日志 有关
nginx -s USR2 飞行中升级
|------------------|-------------------|----------|
| nginx 命令 | kill 命令 | 含义 |
| nginx -s relaod | kill -s HUP | 重新加载配置文件 |
| nginx -s stop | kill -9 ( KILL ) | 立即停止 |
| nginx -s quit | kill -3 ( QUITt ) | 优雅的退出 |
| nginx -s reopen | kill -s USR1 | 重新生成日志文件 |
| nginx | kill -s USR2 | 飞行中升级 |
nginx新版本升级:
tar -zxvf nginx-1.xx.xx.tar.gz 1.22.0
cd nginx-1.xx.xx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old 备份
cp /opt/nginx-1.××/objs/nginx /usr/local/nginx/sbin/nginx
重启服务 并且
./nginx -V # 查看版本
make upgrade
或者先 killall nginx ,再 /usr/local/nginx/sbin/nginx
例:Nginx 1.12 升级到 1.22
1、tar解包
tar zxvf nginx-1.22.0.tar.gz
2、./configure [root@localhost opt]# cd nginx-1.22.0/
[root@localhost nginx-1.22.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
[root@localhost nginx-1.22.0]# make
3、把 /usr/local/nginx/sbin/nginx 备份成 /usr/local/nginx/sbin/nginx.bak
4、把 /opt/nginx-1.22.0/objs/nginx 复制到 /usr/local/nginx/sbin/nginx
5、重新启动 nginx 服务,查看版本
2.6添加Nginx****系统服务
方法一: service 系统管理
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 // 这是固定格式, 2345 表示运行级别,之后为开机执行顺序和关机执
行顺序
#description:Nginx Service Control Script // 这也是必须的
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "1" in start) COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx # 添加为系统服务
systemctl stop nginx
systemctl start nginx
service nginx start|stop|restart|reload
方法二:
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target[Unit]: 服务的说明
Description: 描述服务
After: 依赖,当依赖的服务启动之后再启动自定义的服务
[Service] 服务运行参数的设置
Type=forking 是后台运行的形式,使用此启动类型应同时指定
PIDFile 以便 systemd 能够跟踪服务的主进程。
ExecStart 为服务的具体运行命令
ExecReload 为重启命令
ExecStop 为停止命令
PrivateTmp=True 表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install] 服务安装的相关设置,可设置为多用户chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
实验:
[root@localhost sbin]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target[root@localhost sbin]# chmod 754 /lib/systemd/system/nginx.service
[root@localhost sbin]# systemctl daemon-reload #重新加载配置文件
[root@localhost sbin]# systemctl enable nginx.service #nginx开机自启动
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@localhost sbin]# systemctl start nginx.service #开启nginx服务
[root@localhost sbin]# lsof -i:80 #查看httpd端口是否开启
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 64255 root 6u IPv4 122407 0t0 TCP *:http (LISTEN)
nginx 64256 nginx 6u IPv4 122407 0t0 TCP *:http (LISTEN)
三、nginx主配置文件****nginx.conf *
-------- 认识 Nginx 服务的主配置文件 nginx.conf--------
vim /usr/local/nginx/conf/nginx.conf
3.1****全局配置 *
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了
CPU
2P:2个物理CPU
4C:1物理核有4个核心一共有2*4=8个逻辑核
8G内存
4C 16G 高效盘 40G (系统盘) 存储 oss 网络存储 nas 50M
master_processes off/on #Master 进程 开启/关闭 (默认开启,一般不动)
#error_log logs/error.log; #错误日志文件 的位置 /usr/local/nginx/logs/error.log
#pid logs/nginx.pid; #PID 文件 的位置**/usr/local/nginx/logs/nginx.pid**
3.2 events I/O****事件配置 *
什么是epoll:
epoll 把所有事件记录在列表当中,当列表中的事件处理完之后 会通知epoll 我的事件处理完了,需要你处理我的事件,而不是一个一个问事件处理好了没有,这样就可以处理大量并发
epoll 用来优化
epoll 只能在 events 里使用
events {
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096 个连接(worker_connections 每个 worker 进程可以同时处理的最大连接数,默认1024) 2000
}
如提高每个进程的连接数还需执行 "ulimit -n 65535" 命令临时修改本地每个进程可以同时打开的最大文件数。
在 Linux 平台上,在进行高并发 TCP 连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制( 这是因为系统为每个 TCP 连接都要创建一个 socket 句柄,每个 socket 句柄同时也是一个文件句柄) 。
可使用 ulimit -a 命令查看系统允许当前用户进程打开的文件数限制。
vim /etc/security/limits.conf #永久修改进程最大打开文件数
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。若工作进程数为 8 ,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数已超过 3 万个( 4 096×8=32 768 ),当然具体还要看服务器硬件、网络带宽等物理条件的性
能表现。
临时修改 进程最大打开文件数
[root@localhost security]# ulimit -n 65535 (0-65535 一共 65536 个进程)
[root@localhost security]# ulimit -a
永久修改进程最大打开文件数
[root@localhost security]# vim /etc/security/limits.conf
3.3 HTTP****配置 *
使用 "http { }" 界定标记,包括访问日志、 HTTP 端口、网页目录、默认字符集、连接保持,以及后面要讲到的虚拟 Web 主机、 PHP 解析等一系列设置,其中大部分配置语句都包含在子界定标记"server { }" 内
每一个 server 都是一个网站
location 匹配网页(匹配网站目录)
怎么匹配多个网页? 在location后面加路径就行
http {
##文件扩展名与文件类型映射表(文本文件、图像、视频)
include mime.types; #在/usr/local/nginx/conf/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 logs/access.log main;
##支持文件发送(下载)
sendfile on;
##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web 服务的监听配置
server { #每一个 server 都是一个网站
##监听地址及端口(任何一个端口,只要在 0-65535 之间)
listen 80;
##站点域名,可以有多个,用空格隔开
server_name <www.kgc.com>;
##网页的默认字符集(默认是俄语)
charset utf-8;
##根目录配置
location / { #location 匹配网站目录
##网站根目录的位置/usr/local/nginx/html
root html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}
}日志格式设定:
$remote_addr 与 http_x_forwarded_for 用以记录客户端的 ip 地址; remote_user :用来记录客户端用户名称;
time_local : 用来记录访问时间与时区; request : 用来记录请求的 url 与 http 协议;
status : 用来记录请求状态;成功是 200 , body_bytes_sent :记录发送给客户端文件主体内容大小;
http_referer :用来记录从哪个页面链接访问过来的; http_user_agent :记录客户浏览器的相关信息;
通常 web 服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过 $remote_add 拿到的 IP 地址是反向代理服务器的iP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的IP 地址和原来客户端的请求的服务器地址。
location 常见配置指令, root 、 alias 、 proxy_pass
root (根路径配置): root /var/www/html 编译安装 /usr/local/nginx/html
请求 www.kgc.com/test/1.html ,会返回文件 /var/www/html/test/1.html
alias (别名配置): alias /var/www/html
请求 www.kgc.com/test/1.html ,会返回文件 /var/www/html/1.html
proxy_pass (反向代理配置)
四、实战案列
4.1 Nginx****的访问状态统计
--------访问状态统计配置--------
- 查看已安装的 Nginx 是否包含HTTP_STUB_STATUS 模块
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
[root@localhost ~]# cat /opt/nginx-1.22.0/auto/options |grep YES
#可查看 nginx 已安装的所有模块
2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# cp nginx.conf nginx.conf.bak 或 cp nginx.conf{,_bak} #备份
[root@localhost conf]# vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name <www.kgc.com>;
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status 配置##
location /status { #访问位置为/status
stub_status on; # 打开状态统计功能
access_log off; # 关闭此位置的日志记录
}
}
}
3. 重启服务,访问测试
[root@localhost conf]# nginx -t #检查语法
[root@localhost conf]# systemctl restart nginx.service #重启nginx服务
浏览器访问 http://192.168.10.19/status
Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP 握手次数、 已处理的请求数。
[root@localhost conf]# curl -s http://192.168.10.19/status 统计网页访问量
可结合 awk 与 if 语句进行性能监控。
location 每一行结束都要加 ;不然会报错
4.2****基于授权的访问控制(账户、密码)
**应用场景:**企业内部,会给每个员工一个文档,包含用户名密码,只有企业内部人员才能登录
httpd-tools 下的 htpasswd (生成 HTTP 用户密码认证文件的工具) 、 ab(压力测试工具)
--------基于授权的访问控制--------
1.生成用户密码认证文件
[root@localhost conf]# yum install -y httpd-tools
[root@localhost conf]# htpasswd -c /usr/local/nginx/passwd.db yss
New password:
Re-type new password:
Adding password for user yss
[root@localhost nginx]# chown nginx /usr/local/nginx/passwd.db
passwd.db属主改为nginx
[root@localhost nginx]# chmod 400 /usr/local/nginx/passwd.db
passwd.db属主设为只读
2.修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加认证配置##
auth_basic "secret"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
3.重启服务,访问测试
[root@localhost nginx]# nginx -t
[root@localhost nginx]# systemctl restart nginx
4、浏览器访问 http://192.168.190.50
需要填写用户名、密码
4.3****基于客户端的访问控制(黑白名单)
使用情况:防止黑客攻击;禁止谁访问
--------基于客户端的访问控制--------
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加控制规则##
allow 192.168.10.20; #允许访问的客户端 IP
deny all; #拒绝其它IP客户端访问
}
}
[root@localhost nginx]# nginx -t #检查语法
[root@localhost nginx]# systemctl restart nginx
4.4基于域名的Nginx****虚拟主机
--------基于域名的 Nginx 虚拟主机--------
1.为虚拟主机提供域名解析
echo "192.168.190.50 <www.kgc.com> <www.benet.com>" >> /etc/hosts
2.为虚拟主机准备网页文档
mkdir -p /usr/local/nginx/html/benet
mkdir -p /usr/local/nginx/html/kgc
echo "<h1><www.kgc.com></h1>" > /usr/local/nginx/html/kgc/index.html
echo "<h1><www.benet.com></h1>" > /usr/local/nginx/html/benet/index.html
3.修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 80;
server_name <www.kgc.com>; #设置域名<www.kgc.com>
charset utf-8;
access_log logs/<www.kgc.access.log>; #设置日志名
location / {
root /usr/local/nginx/html/kgc; #设置<www.kgc.com> 的工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name <www.benet.com>; #设置域名<www.benet.com>
charset utf-8;
access_log logs/<www.benet.access.log>;
location / {
root /usr/local/nginx/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
4.重启服务,访问测试
nginx -t
systemctl restart nginx
浏览器访问
4.5基于IP的Nginx****虚拟主机
ifconfig ens33:0 192.168.190.40 netmask 255.255.255.0
ip a
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.190.40:80; #设置监听地址192.168.10.19
server_name <www.kgc.com>;
charset utf-8;
access_log logs/<www.kgc.access.log>;
location / {
root /usr/local/nginx/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.190.50:80; #设置监听地址192.168.10.40
server_name <www.benet.com>;
charset utf-8;
access_log logs/<www.benet.access.log>;
location / {
root /usr/local/nginx/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
nginx -t # 报错的话在 /usr/local/nginx/logs/error.log 下,查看日志
systemctl restart nginx
浏览器访问
4.6基于端口的Nginx****虚拟主机
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.190.50:8080; #设置监听 8080 端口
server_name <www.kgc.com>;
charset utf-8;
access_log logs/<www.kgc.access.log>;
location / {
root /usr/local/nginx/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.190.50:8888; #设置监听 8888 端口
server_name <www.benet.com>;
charset utf-8;
access_log logs/<www.benet.access.log>;
location / {
root /usr/local/nginx/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
systemctl restart nginx
浏览器访问
五、LNMP架构
Nginx 工作原理
这里需要结合 Apache 的工作,对 PHP 文件处理过程的区别
1 : Nginx 是通过 php-fpm 这个服务来处理 php 文件
2 : Apache 是通过 libphp5.so 这个模块来处理 php 文件
Apache :
Apache 的 libphp5.so 随着 Apache 服务器一起运行,而 Nginx 和 php-fpm 是各自独立运行,所
以在运行过程中, Nginx 和 php-fpm 都需要分别启动!
修改 Nginx 配置文件,启动 Nginx 服务,修改 php 配置文件,启动 php-fpm 服务
反向代理 对应页面 Ip: 端口
5.1安装 Nginx 服务
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2、创建运行用户
useradd -M -s /sbin/nologin nginx
3、编译安装
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/''.6hvcf
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
make && make install
4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
5.2安装 MySQL 服务
1、安装Mysql环境依赖包
yum -y install \
ncurses \
ncurses-devel \
bison \
cmake
2、创建运行用户
useradd -M -s /sbin/nologin mysql
tail /etc/paswsd
3、编译安装
cd /opt
tar zxvf mysql-boost-5.7.20.tar.gz
cd /opt/mysql-5.7.20/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
make && make install
4、修改mysql 配置文件
vim /etc/my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
5、更改mysql安装目录和配置文件的属主属组
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
6、设置路径环境变量
echo 'export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
source /etc/profile
7、初始化数据库
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
8、添加mysqld系统服务
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld
9、修改mysql 的登录密码
mysqladmin -u root -p password "abc123"
10、授权远程登录
mysql -u root -p
【安装配置 PHP 解析环境】
1、安装环境依赖包
yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
2、编译安装
cd /opt
tar jxvf php-7.1.10.tar.bz2
cd php-7.1.10
./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip
make && make install
3、路径优化
ln -s /usr/local/php/bin/* /usr/local/bin/
ln -s /usr/local/php/sbin/* /usr/local/sbin/
4、调整PHP配置文件
php有三个配置文件:
php.ini 主配置文件
php-fpm.conf 进程服务配置文件
www.conf 扩展配置文件
#调整主配置文件:
cp /opt/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini
vim /usr/local/php/lib/php.ini
--1170行--修改
mysqli.default_socket = /usr/local/mysql/mysql.sock
--939行--取消注释,修改
date.timezone = Asia/Shanghai
php -m #验证安装的模块
#调整进程服务配置文件:
cd /usr/local/php/etc/
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
--17行--去掉";"注释
pid = run/php-fpm.pid
#调整扩展配置文件:
cd /usr/local/php /etc/php-fpm.d/
cp www.conf.default www.conf
5、启动php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini
netstat -anpt | grep 9000
#PHP-FPM(FastCGI Process Manager:FastCGI 进程管理器)是一个 PHPFastCGI 管理器, 由于Nginx服务器不能处理动态页面,需要由 Nginx 把动态请求交给 php-fpm 进程进行解析。
cd /opt/php-7.1.10/sapi/fpm
cp php-fpm.service /usr/lib/systemd/system/php-fpm.service
systemctl restart php-fpm.service
6、配置 Nginx 支持 PHP 解析
vim /usr/local/nginx/conf/nginx.conf
--65行--取消注释,修改
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; #将 /scripts 修改为nginx的工作目录
#fastcgi_param SCRIPT_FILENAME document_rootfastcgi_script_name; #$document_root 代表当前请求在root指令中指定的值
include fastcgi_params;
}
systemctl restart nginx.service
7、验证PHP 测试页
vim /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
浏览器访问
http://192.168.80.10/index.php
8、验证数据库工作是否正常
mysql -u root -p
CREATE DATABASE bbs;
GRANT all ON bbs.* TO 'bbsuser'@'%' IDENTIFIED BY 'admin123';
GRANT all ON bbs.* TO 'bbsuser'@'localhost' IDENTIFIED BY 'admin123';
flush privileges;
vim /usr/local/nginx/html/index.php #替换原来的测试页内容
<?php
$link=mysqli_connect('192.168.80.10','bbsuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>
浏览器访问
http://192.168.80.10/index.php
【部署 Discuz!社区论坛 Web 应用】
cd /opt
unzip Discuz_X3.4_SC_UTF8.zip -d /opt/dis
cd /opt/dis/dir_SC_UTF8/
cp -r upload/ /usr/local/nginx/html/bbs/
调整论坛目录的权限:
cd /usr/local/nginx/html/bbs/
chown -R nginx ./config/
chown -R nginx ./data/
chown -R nginx ./uc_client/
chown -R nginx ./uc_server/
或
chmod -R 777 ./config/
chmod -R 777 ./data/
chmod -R 777 ./uc_client/
chmod -R 777 ./uc_server/
论坛页面访问
http://192.168.80.10/bbs/install/index.php
数据库服务器:localhost ###本地架设就用localhost,如何不是在在本机上就要填写IP地址和端口号
数据库名字:bbs
数据库用户名:bbsuser
数据库密码:admin123
管理员账号:admin
管理员密码:admin123
访问论坛页面:
http://192.168.80.10/bbs/index.php
http://192.168.80.10/bbs/admin.php
----------------fpm参数优化-------------------
vim /usr/local/php/etc/php-fpm.conf
pid = run/php-fpm.pid
vim /usr/local/php/etc/php-fpm.d/www.conf
--96行--
pm = dynamic #fpm进程启动方式,动态的
--107行--
pm.max_children=20 #fpm进程启动的最大进程数
--112行--
pm.start_servers = 5 #动态方式下启动时默认开启的进程数,在最小和最大之间
--117行--
pm.min_spare_servers = 2 #动态方式下最小空闲进程数
--122行--
pm.max_spare_servers = 8 #动态方式下最大空闲进程数
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` #重启php-fpm
netstat -anpt | grep 9000
ps -elf | grep php-fpm
六、Nginx相对于Apache的优势
- 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
- 抗并发, nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,多个连接对应一个进程,负载能力比apache 高很多,而apache 则是同步多进程模型,只能一个连接对应一个进程,当压力过大时,它是会被阻塞型的。在高并发下nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
- 设计高度模块化,编写模块相对简单
- 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题, apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
- 一般用于处理静态文件,静态处理性能比 apache 高三倍以上
- 作为负载均衡服务器,支持 7 层负载均衡
- 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
8.nginx 启动特别容易 , 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,
支持热部署,比如:实现不间断服务的情况下进行软件版本的升级与版本的回退 - 社区活跃,各种高性能模块出品迅速
Apache相对于Nginx 的优势:
1.apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
2.apache 发展到现在,模块超多,基本想到的都可以找到
3.apache 更为成熟,少 bug , nginx 的 bug 相对较多
4.apache 超稳定,一个进程死掉时,会影响到多个用户的使用,稳定性差
5.apache 对 PHP 支持比较简单, nginx 需要配合其他后端用
6.apache 在处理动态请求有优势, nginx 在这方面是鸡肋,一般动态请求要 apache 去做, nginx 适合静 态和反向。
7.apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区