nginx从入门到精通

第一章 Nginx简介

1.1 Nginx 概述

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能 力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

1.2 Nginx 作为 web 服务器

Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数

1.3 正向代理

Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

1.4 反向代理

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器

nginx从入门到精通_第1张图片

1.5 负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服 务器处理完毕后,再将结果返回给客户端。 这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成 本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂 度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易 造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情 况呢? 我们首先想到的可能是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机 器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能 满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量 是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能 够满足需求的。那么怎么办呢? 上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题 的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解 决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们 所说的负载均衡

nginx从入门到精通_第2张图片

1.6 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。

nginx从入门到精通_第3张图片

第二章 Nginx安装

2.1 在linux系统中的安装

前期准备工作:

GCC编译器

Nginx是使用C语言编写的程序,因此想要运行Nginx就需要安装一个编
译工具。GCC就是一个开源的编译器集合,用于处理各种各样的语言,
其中就包含了C语言。
使用命令yum install -y gcc来安装
安装成功后,可以通过gcc --version来查看gcc是否安装成功
PCRE
Nginx在编译过程中需要使用到PCRE库(perl Compatible Regular
Expressoin 兼容正则表达式库),因为在Nginx的Rewrite模块和http核
心模块都会使用到PCRE正则表达式语法。
可以使用命令yum install -y pcre pcre-devel来进行安装
安装成功后,可以通过rpm -qa pcre pcre-devel来查看是否安装成功
zlib
zlib库提供了开发人员的压缩算法,在Nginx的各个模块中需要使用gzip
压缩,所以我们也需要提前安装其库及源代码zlib和zlib-devel
可以使用命令yum install -y zlib zlib-devel来进行安装
安装成功后,可以通过rpm -qa zlib zlib-devel来查看是否安装成功
OpenSSL
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包进行
安全通信,并且避免被窃听。
SSL:Secure Sockets Layer安全套接协议的缩写,可以在Internet上提供
秘密性传输,其目标是保证两个应用间通信的保密性和可靠性。在
Nginx中,如果服务器需要提供安全网页时就需要用到OpenSSL库,所
以我们需要对OpenSSL的库文件及它的开发安装包进行一个安装。
可以使用命令yum install -y openssl openssl-devel来进行安装
安装成功后,可以通过rpm -qa openssl openssl-devel来查看是否安
装成功
上述命令,一个个来的话比较麻烦,我们也可以通过一条命令来进行安
装...............................

yum install -y gcc pcre pcre-devel zlib zlib-devel openssl
openssl-devel
进行全部安装。
查看安装版本
rpm -qa pcre pcre-devel zlib zlib-devel openssl openssl-devel
rpm 软件包管理工具


第一种方式源码安装

1.官网下载

http://nginx.org/en/download.html 或者 wget http://nginx.org/download/nginx-1.20.1.tar.gz

解压完成后直接进入解压目录下 运行 ./configure 文件

2.make 下

3.再接着 make install 安装完成

4.可以通过whereis nginx 查找安装位置,安装完毕会生成一个nginx文件夹

错误信息:
./configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:安装pcre-devel
yum install pcre-devel
错误信息:
./configure: error: the HTTP gzip module requires the zlib library.
解决方法:安装zlib-devel
yum install zlib-devel

过程中可能会出现make: *** No rule to make target build', needed bydefault'. Stop.错误

需要安装openssl以及ncurses组件

yum install -y openssl*

yum -y install ncurses-devel


checking for C compiler ... not found ./configure: error: C compiler cc is not found

yum install glibc-devel

第二种方式 通过yum命令安装

nginx从入门到精通_第4张图片

nginx从入门到精通_第5张图片

nginx从入门到精通_第6张图片

nginx从入门到精通_第7张图片

上图地址 http://nginx.org/en/linux_packages.html#RHEL-CentOSsudo yum install yum-utils 使用yum安装确保要能连接外部网络

vim /etc/yum.repos.d/nginx.repo 新文件

[nginx-stable] name=nginx stable repo
baseurl=http://nginx.org/packages/centos/releasever/releasever/basearch/
gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline] name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/releasever/releasever/basearch/
gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

想要安装主线版本可以执行(开发版本) (选择性确认)
sudo yum-config-manager --enable nginx-mainline

开发版本是与稳定版相对应,手机公司根据不同的操作系统开发出的一种ROM。开发版本的性质是具有一些可以接受的BUG,带有ROOT权限,自带较为新颖但部分未通过完全测试的功能组件。不推荐普通用户即非专业用户使用。

加 -y 默认确认用户往下

sudo yum install nginx

sudo yum install -y nginx
./nginx -V

nginx从入门到精通_第8张图片

auto 存放跟编译相关的脚本文件
CHANGES 不同版本的变更记录
CHANGES .ru 使用俄罗斯版本编写的版本变更记录
conf 存放着nginx的配置文件
configure nginx的自动脚本程序,作用一:用于检测环境,根据检测环境的结果去生成C语言代码,作用二:会生成编译代码所需要的Makefile以及objs文件
contribute 存放在特殊的脚本文件,这里可以通过查看里面的more README查看脚本都有哪些作用
LICENSE 许可证的相关描述文件
man 存放着nginx的帮助文档
README 阅读指南,可以读到nginx的相关描述信息
src nginx的源代码

第三种方式Nginx的源码复杂安装

 ./configure --help

这种方式就是在安装nginx的时候通过./configure进行参数设置

PATH:是和路径相关的配置信息

with:是启动模块,默认是关闭的

without:是关闭模块,默认是开启的

--prefix=PATH

指向Nginx的安装目录,默认值为/usr/local/nginx

--sbin-path=PATH

指向(执行)程序文件(nginx)的路径,默认值为/sbin/nginx

--modules-path=PATH

指向Nginx动态模块安装目录,默认值为/modules

--conf-path=PATH

指向配置文件(nginx.conf)的路径,默认值为 /conf/nginx.conf

--error-log-path=PATH

指向错误日志文件的路径,默认值为/logs/error.log

--http-log-path=PATH

指向访问日志文件的路径,默认值为/logs/access.log

--pid-path=PATH

指向Nginx启动后进行ID的文件路径,默认值为 /logs/nginx.pid

--lock-path=PATH

指向Nginx锁文件的存放路径,默认值为/logs/nginx.lock


./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--modules-path=/usr/local/nginx/modules \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--lock-path=/usr/local/nginx/logs/nginx.lock



在使用上述命令之前,需要将之前服务器已经安装的nginx进行卸载,卸 载的步骤分为三步骤: 

步骤一:需要将nginx的进程关闭

./nginx -s stop

步骤二:将安装的nginx进行删除

rm -rf /usr/local/nginx

步骤三:将安装包之前编译的环境清除掉,位置是在./configure所在的文件夹

make clean

2.2 在windows系统中的安装

下载后解压就能用

Nginx服务器启停命令

1. Nginx服务的信号控制 2. Nginx的命令行控制

1. Nginx服务的信号控制

nginx从入门到精通_第9张图片

调用命令为kill -signal PID
signal:即为信号;PID即为获取到的master线程ID

1. 发送TERM/INT信号给master进程,会将Nginx服务立即关闭。
2. more ../logs/nginx.pid

  kill -TERM 8510 

2. 发送QUIT信号给master进程,master进程会控制所有的work进程不
再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
kill -QUIT PID
3. 发送HUP信号给master进程,master进程会把控制旧的work进程不
再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根
据nginx的配置文件重新启动新的work进程
kill -HUP PID
4. 发送USR1信号给master进程,告诉Nginx重新开启日志文件
kill -USR1 PID

nginx从入门到精通_第10张图片

5. 发送USR2信号给master进程,告诉master进程要平滑升级,这个时
候,会重新开启对应的master进程和work进程,整个系统中将会有
两个master进程,并且新的master进程的PID会被记录
在/usr/local/nginx/logs/nginx.pid而之前的旧的master进程
PID会被记录在/usr/local/nginx/logs/nginx.pid.oldbin文件
中,接着再次发送QUIT信号给旧的master进程,让其处理完请求后
再进行关闭

USR2

nginx从入门到精通_第11张图片

nginx从入门到精通_第12张图片


6. 发送WINCH信号给master进程,让master进程控制不让所有的work
进程在接收新的请求了,请求处理完后关闭work进程。注意master进程不会被关闭掉
kill -WINCH PID

方式二:Nginx的命令行控制

nginx -h来查看都有哪些参数可以用:

nginx从入门到精通_第13张图片

-?和-h:显示帮助信息
-v:打印版本号信息并退出
-V:打印版本号信息和配置信息并退出
-t:测试nginx的配置文件语法是否正确并退出
-T:测试nginx的配置文件语法是否正确并列出用到的配置文件信息然后退出(错误和小t一样)
-q:在配置测试期间禁止显示非错误消息

-s:signal信号,后面可以跟 :
stop[快速关闭,类似于TERM/INT信号的作用]
quit[优雅的关闭,类似于QUIT信号的作用]
reopen[重新打开日志文件类似于USR1信号的作用]
reload[类似于HUP信号的作用]
-p:prefix,指定Nginx的prefix路径,(默认为: /usr/local/nginx/)
-c:filename,指定Nginx的配置文件路径,(默认为: conf/nginx.conf)
-g:用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置

nginx从入门到精通_第14张图片

nginx从入门到精通_第15张图片

做完上面操作后这个时候无法直接关闭。

nginx从入门到精通_第16张图片

Nginx服务器版本升级和新增模块

如果想对Nginx的版本进行更新,或者要应用一些新的模块,最简单的
做法就是停止当前的Nginx服务,然后开启新的Nginx服务。但是这样会
导致在一段时间内,用户是无法访问服务器。为了解决这个问题,我们
就需要用到Nginx服务器提供的平滑升级功能。这个也是Nginx的一大特
点,使用这种方式,就可以使Nginx在7*24小时不间断的提供服务了。
接下来我们分析下需求:

为了应对上述的需求,这里我们给大家提供两种解决方案:
方案一:使用Nginx服务信号完成Nginx的升级
方案二:使用Nginx安装目录的make命令完成升级

准备工作
(1)先准备两个版本的Nginx分别是 1.14.2和1.16.1
(2)使用Nginx源码安装的方式将1.14.2版本安装成功并正确访问
进入安装目录
./configure
make && make install
(3)将Nginx1.16.1进行参数配置和编译,不需要进行安装。
进入安装目录
./configure
make


方案一:使用Nginx服务信号完成Nginx的升级

第一步:将1.14.2版本的sbin目录下的nginx进行备份
cd /usr/local/nginx/sbin
mv nginx nginxold

第二步:将Nginx1.16.1安装目录编译后的objs目录下的nginx文件,拷贝
到原来/usr/local/nginx/sbin目录下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
第三步:发送信号USR2给Nginx的1.14.2版本对应的master进程
kill -USR2 'more /usr/local/log/nginx.pid'

第四步:发送信号QUIT给Nginx的1.14.2版本对应的master进程
kill -QUIT 'more /usr/local/logs/nginx/pid/old.oldbin'

整个过程也就是替换了下nginx文件!!!

方案二:使用Nginx安装目录的make命令完成升级
第一步:将1.14.2版本的sbin目录下的nginx进行备份
cd /usr/local/nginx/sbin
mv nginx nginxold
第二步:将Nginx1.16.1安装目录编译后的objs目录下的nginx文件,拷贝
到原来/usr/local/nginx/sbin目录下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
第三步:进入到安装目录,执行make upgrade
第四步:查看是否更新成功
./nginx -v
方案一和方案二方法其实是一样的,只是方案二不用我们再输命令了,直接通过make upgrade完成相关操作
在整个过程中,其实Nginx是一直对外提供服务的。并且当Nginx的服务
器启动成功后,我们是可以通过浏览器进行直接访问的,同时我们可以
通过更改html目录下的页面来修改我们在页面上所看到的内容,那么问
题来了,为什么我们要修改html目录下的文件,能不能多添加一些页面
是Nginx的功能更加丰富,还有前面聊到Nginx的前端功能又是如何来实
现的,这就需要我们对Nginx的核心配置文件进行一个详细的学习

linux系统 常用命令

cd /usr/local/nginx/sbin/ ./nginx 启动 ./nginx -s stop 停止 ./nginx -s quit 安全退出 ./nginx -s reload 重新加载配置文件 ps aux|grep nginx

nginx.conf配置文件

三大部分

代码示例

#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


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"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 8443;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location /oneblog/ {
root /;
rewrite ^/oneblog/(.*)$ /oneblog/oneblog/$1 break;
}

#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;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}

}

3.2.1第一部分:全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。

比如

worker_processes 1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约

user指令

nginx从入门到精通_第17张图片

(1)user:用于配置运行Nginx服务器的worker进程的用户和用户组。

nginx从入门到精通_第18张图片

该属性也可以在编译的时候指定,语法如下./configure --user=user
--group=group ,如果两个地方都进行了设置,最终生效的是配置文件中
的配置。

该指令的使用步骤:
(1)设置一个用户信息"www"

user www;

(2) 创建一个用户

useradd www
(3)修改user属性
user www
(4)创建/root/html/index.html页面,添加如下内容




Welcome to nginx!



Welcome to nginx!


If you see this page, the nginx web server is
successfully installed and
working. Further configuration is required.


For online documentation and support please refer
to
nginx.org.

Commercial support is available at
nginx.com.


Thank you for using nginx.


I am WWW



(5)修改nginx.conf
location / {
root /root/html;
index index.html index.htm;
}

(5)测试启动访问

1 页面会报403拒绝访问的错误
(6)分析原因

因为当前用户没有访问/root/html目录的权限
(7)将文件创建到 /home/www/html/index.html ,修改配置
location / {
root /home/www/html;
index index.html index.htm;
}
(8)再次测试启动访问
能正常访问。

综上所述,使用user指令可以指定启动运行工作进程的用户及用户组,
这样对于系统的权限访问控制的更加精细,也更加安全。

work process指令

master_process:用来指定是否开启工作进程。

nginx从入门到精通_第19张图片

这个指令需要关闭nginx服务器重启才能生效

nginx从入门到精通_第20张图片

daemon:设定Nginx是否以守护进程的方式启动。默认是on.
守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,
不会随着终端关闭而停止。

nginx从入门到精通_第21张图片

nginx从入门到精通_第22张图片

pid:用来配置Nginx当前master进程的进程号ID存储的文件路径。

nginx从入门到精通_第23张图片

该属性可以通过./configure --pid-path=PATH来指定


error_log:用来配置Nginx的错误日志存放路径

nginx从入门到精通_第24张图片

该属性可以通过./configure --error-log-path=PATH来指定
其中日志级别的值有:
debug|info|notice|warn|error|crit|alert|emerg,翻译过来为试|信
息|通知|警告|错误|临界|警报|紧急,这块建议大家设置的时候不要设
置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性
能。

include:用来引入其他配置文件,使Nginx的配置更加灵活

nginx从入门到精通_第25张图片

nginx从入门到精通_第26张图片

把原来nginx.conf中的文件注释掉

nginx从入门到精通_第27张图片

3.2.2第二部分:evernts块

比如上面的配置

events { worker_connections 1024; }

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。 上述例子就表示每个 work process 支持的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

(1)accept_mutex:用来设置Nginx网络连接序列化

nginx从入门到精通_第28张图片

这个配置主要可以用来解决常说的"惊群"问题。大致意思是在某一个时
刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也
就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以
获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性
能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接
进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。

nginx从入门到精通_第29张图片

(2)multi_accept:用来设置是否允许同时接收多个网络连接

nginx从入门到精通_第30张图片

如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的
连接。否则,一个工作进程可以同时接受所有的新连接


(3)worker_connections:用来配置单个worker进程最大的连接数

nginx从入门到精通_第31张图片

这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能
的连接数。另外,number值不能大于操作系统支持打开的最大文件句
柄数量。
查看Linux系统默认的最大文件句柄数
ulimit -n

4)use:用来设置Nginx服务器选择哪种事件驱动来处理网络消息。

nginx从入门到精通_第32张图片

注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容,
method的可选值有select/poll/epoll/kqueue等,之前在准备centos环
境的时候,我们强调过要使用linux内核在2.6以上,就是为了能使用
epoll函数来优化Nginx。
另外这些值的选择,我们也可以在编译的时候使用

--with-select_module、--without-select_module、
--with-poll_module、--without-poll_module来设置是否需要将对应
的事件驱动模块编译到Nginx的内核。

select先创建事件的描述符集合,对于一个描述符,可以关注其上面的Read事件、Write事件以及Exception事件,所以要创建三类事件描述符集合,分别用来处理Read事件的描述符、Write事件的描述符、Exception事件的描述符,然后调用底层的select()函数,等待事件发生,轮询所有事件描述符集合的每一个事件描述符,检查是否有事件发生,有的话就处理。select效率低,主要是轮询效率低,而且还要分别轮询三个事件描述符的集合。


poll方法与select类似,都是先创建一个关注事件的描述符集合,再去等待这些事件发生,然后再轮询描述符集合,检查有无事件发生,如果有,就去处理。不同点是poll为Read事件、Write事件以及Exception事件只创建一个集合,在每个描述符对应的结构上分别设置Read事件、Write事件以及Exception事件。最后轮询的时候,可以同时检察权这三个事件是否发生。可以说,poll库是select库的优化实现。


epoll是Nginx支持的高性能事件驱动库之一。是公认的非常优秀的事件驱动模型。和poll库跟select库有很大的不同,最大区别在于效率。我们知道poll库跟select库都是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候,再去轮询检查这个列表,以判断事件是否发生。这样在描述符多的应用中,效率就显得比较低下了。一种比较好的方式是把列表的管理交由内核负责,一旦某种事件发生,内核就把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。首先,epoll库通过相关调用同志内核创建一个有N个描述符的事件列表,然后给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去。完成设置以后,epoll库就开始等待内核通知事件发生了,某一事件发生后,内核讲发生事件的描述符列表上报给epoll库,得到事件列表的epoll库,就可以进行事件处理了。epoll库在linux平台是高效的,它支持一个进程打开大数目的事件描述符,上限是系统可以打开文件的最大数目;同时,epoll库的IO效率不随描述符数量的增加而线性下降,因为它只会对内核上报的活跃的描述符进行操作。


events指令配置实例
打开Nginx的配置文件 nginx.conf,添加如下配置
events{
accept_mutex on;
multi_accept on;
worker_commections 1024;
use epoll;
}

 

3.2.3第三部分:http块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http 全局块、server 块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓
存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

nginx从入门到精通_第33张图片

http块
定义MIME-Type 
我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的
文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME
Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务
器,也需要能够识别前端请求的资源类型。
在Nginx的配置文件中,默认有两行配置

include mime.types;
default_type application/octet-stream;

(1)default_type:用来配置Nginx响应前端请求默认的MIME类型。

nginx从入门到精通_第34张图片

在default_type之前还有一句include mime.types ,include之前我们已
经介绍过,相当于把mime.types文件中MIMT类型与相关类型文件的文
件后缀名的对应关系加入到当前的配置文件中。

举例来说明:
有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符
串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快
速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并
且响应性能非常快。

location /get_text {
#这里也可以设置成text/plain
default_type text/html;
return 200 "This is nginx's text";
}
location /get_json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}


自定义服务日志
Nginx中日志的类型分access.log、error.log。
access.log:用来记录用户所有的访问请求。
error.log:记录nginx本身运行时的错误信息,不会记录用户的访问请
求。
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使
用到两个指令,分别是access_log和log_format指令。
(1)access_log:用来设置用户访问日志的相关属性。

nginx从入门到精通_第35张图片

nginx从入门到精通_第36张图片

(2)log_format:用来指定日志的输出格式。

nginx从入门到精通_第37张图片

nginx从入门到精通_第38张图片

log_format myformat '======⇒ This is My format';
access_log logs/my.log myformat;

nginx从入门到精通_第39张图片

其他配置指令
(1)sendfile:用来设置Nginx服务器是否使用sendfile()传输文件,该属
性可以大大提高Nginx处理静态资源的性能

nginx从入门到精通_第40张图片

(2)keepalive_timeout:用来设置长连接的超时时间。
为什么要使用keepalive?
我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,
服务端响应完毕后断开连接.
如果客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,
效率相对来说比较低,使用keepalive模式,可以告诉服务器端在处理完
一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其
他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新
连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过
多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时
间。

nginx从入门到精通_第41张图片

(3)keepalive_requests:用来设置一个keep-alive连接使用的次数。

nginx从入门到精通_第42张图片

第 4 章 nginx 配置实例-反向代理

4.1 反向代理实例一

实现效果:使用 nginx 反向代理,访问 www.123.com 直接跳转到 127.0.0.1:8080

第一步修改电脑上的配置文件:

C:\Windows\System32\drivrs\etc
119.3.190.95 www.123.com

nginx从入门到精通_第43张图片

第二步

第三步 nginx从入门到精通_第44张图片

4.3 反向代理实例二

实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 9113 访问 http://127.0.0.1:9113/admintest1 直接跳转到 127.0.0.1:8111

访问 http://127.0.0.1:9113/admintest2 直接跳转到 127.0.0.1:8085

server {
listen 9113;
server_name 119.3.190.95;

#charset koi8-r;

#access_log logs/host.access.log main;

location ~ /admintest1 {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8111;
}

location ~ /admintest2 {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8085;
}

#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;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

location 指令说明 该指令用于匹配

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。 2、~:用于表示 uri 包含正则表达式,并且区分大小写。 3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。 4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。 注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

第 5 章 nginx 配置实例-负载均衡

随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题, 顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应 足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品, 很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎, nginx 就是其中的一个,在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服 务,而且 Nginx 提供了几种分配方式(策略): nginx从入门到精通_第45张图片

实现效果:配置负载均衡

nginx从入门到精通_第46张图片

5种方式

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 

upstream backserver {
server 119.3.190.95;
server 119.3.190.95;

2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 

upstream backserver { 
server 119.3.190.95 weight=3; 
server 119.3.190.95 weight=5; 


3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 

upstream backserver { 
ip_hash; 
server 119.3.190.95; 
server 119.3.190.95; 


4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 

upstream backserver { 
server server1; 
server server2; 
fair; 


5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 

upstream backserver { 
server squid1:3128; 
server squid2:3128; 
hash $request_uri; 
hash_method crc32; 

在需要使用负载均衡的http下增加 

proxy_pass http://backserver/; 
upstream backserver{ 
ip_hash; 
server 127.0.0.1:8383 down; (down 表示当前的server暂时不参与负载) 
server 127.0.0.1:8181 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
server 127.0.0.1:8090; 
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
fail_timeout:max_fails次失败后,暂停的时间

第 6 章 nginx 配置实例-动静分离

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和
静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx
处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使
浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资
源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,
所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,
不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送
一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码
304,如果有修改,则直接从服务器重新下载,返回状态码 200。

nginx从入门到精通_第47张图片

示例

nginx从入门到精通_第48张图片

autoindex on 表示是否会列出目录,就是说不访问该路径下的具体文件,可以展示出该文件夹下有多少文件

示例二

location /oneblog/ {
root /;
rewrite ^/oneblog/(.*)$ /usr/local/images/oneblog/$1 break;
}

#通过访问sunjian.ltd/oneblog/xxx.jpg可以访问到具体的文件

最后检查 Nginx 配置是否正确即可,然后测试动静分离是否成功,之需要删除后端 tomcat 服务器上的某个静态文件,查看是否能访问,如果可以访问说明静态资源 nginx 直接返回 了,不走后端 tomcat 服务器

第七章 Nginx 配置高可用的集群

Keepalived+Nginx 高可用集群(主从模式)

nginx从入门到精通_第49张图片

nginx从入门到精通_第50张图片

1、准备工作

(1)需要两台 nginx 服务器 (2)需要 keepalived (3)需要虚拟 ip

2、配置高可用的准备工作

(1)需要两台服务器 192.168.169.130 和 192.168.169.128 119.3.190.95 

 (2)在两台服务器安装 nginx 

3、在两台服务器安装 keepalived 

 (1)任意文件夹下使用 yum 命令进行安装 yum install keepalived –y 

(2)安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf

4、完成高可用配置(主从配置) 

(1)主服务器修改/etc/keepalived/keepalivec.conf 配置文件以及在主服务器中文件夹/usr/local/src 添加检测脚本nginx_check.sh

   主服务器修改/etc/keepalived/keepalivec.conf 配置文件

global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.169.130
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens32 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1

authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.169.125 // VRRP H 虚拟地址
}
}

主服务器ip地址

nginx从入门到精通_第51张图片

在主服务器文件夹中/usr/local/src 添加检测脚本nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

(2)从服务器修改/etc/keepalived/keepalivec.conf 配置文件以及在从服务器中文件夹/usr/local/src 添加检测脚本

   从服务器修改/etc/keepalived/keepalivec.conf 配置文件

global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.169.130
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens32 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.169.125 // VRRP H 虚拟地址
}
}

从服务器ip地址

nginx从入门到精通_第52张图片

在从服务器文件夹中/usr/local/src 添加检测脚本nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

 (3)把两台服务器上 nginx 和 keepalived 启动        启动 nginx:./nginx 启动        keepalived:systemctl start keepalived.service

通过ip a查看是否有有相应的配置,没有则配置无效

nginx从入门到精通_第53张图片

   (4)测试

在浏览器地址栏输入 虚拟 ip 地址 192.168.169.125 // VRRP H 虚拟地址

nginx从入门到精通_第54张图片

(2)把主服务器(192.168.169.130)nginx 和 keepalived 停止,再输入 192.168.169.125 ,访问成功,配置成功

nginx从入门到精通_第55张图片

/etc/keepalived/keepalivec.conf 原文件

三大部分 

  1. global_defs 全局定义 
  2. vrrp_script chk_http_port 可执行脚本 
  3. vrrp_instance VI_1 虚拟ip的配置第8章 Nginx 的原理


! Configuration File for keepalived

global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}

virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP

real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP

sorry_server 192.168.200.200 1358

real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP

real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

1、mater 和 worker

nginx从入门到精通_第56张图片

2、worker 如何进行工作的,首先客户端发送请求到nginx中的master(管理员),master再把请求分配给worker,worker们通过争抢机制得到请求任务,进一步完成任务

nginx从入门到精通_第57张图片

3、一个 master 和多个 woker 有好处 

(1)可以使用 nginx –s reload 热部署,利于 nginx 进行热部署操作 (不需要停止、重启服务器)

(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断 

4、设置多少个 woker 合适

worker 数和服务器的 cpu 数(linxu中通过cat /proc/cpuinfo查看cpu_cores数)相等是最为适宜的 

5、连接数 worker_connection 

第一个:发送请求,占用了 woker 的几个连接数? 

答案:2 或者 4 个,静态资源访问是2个,而动态资源访问是4个。

 第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的 最大并发数是多少? 

 普通的静态访问最大并发数是: worker_connections * worker_processes /2,  而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。

小插曲
阿里云上如何配置多个站点
https://jingyan.baidu.com/article/f96699bb77fd14c94f3c1b6d.html
https://help.aliyun.com/document_detail/171730.html?spm=5176.22414175.sslink.3.7bfa777cOdqvj2

你可能感兴趣的:(java后端,服务器,java,nginx)