分布式调用与高并发处理 Nginx(一)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 1个月
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 分布式调用与高并发处理 Nginx(一)

一、初识Nginx

1.1 Nginx概述

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。Nginx 专为性能优化而开发,使用异步非阻塞事件驱动模型

常见服务器

  • Apache
  • Tomcat

没有Nginx的情况

有了Nginx的话

1.2 Nginx 四大应用场景

HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

反向代理

反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。增强安全性。

负载均衡

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

1.3 为什么要使用Nginx

背景

互联网飞速发展的今天,大用户量高并发已经成为互联网的主体.怎样能让一个网站能够承载几万个或几十万个用户的持续访问呢?

单机架构

Tomcat 默认配置的最大请求数是150,也就是说同时支持150个并发。具体能承载多少并发,须要看硬件的配置,线程CPU 越多性能越高,分配给JVM的内存越多性能也就越高,但也会加剧GC的负担。

引入反向代理实现负载均衡

负载均衡就是一个web服务器解决不了的问题可以通过多个web服务器来平均分担压力来解决,并发过来的请求被平均分配到多个后台web服务器来处理,这样压力就被分解开来。

总结

  1. 它可以高并发连接,官方测试能够支撑5万并发连接,在实际生产环境中可以支撑2到4万并发连接。
  2. 内存消耗少
  3. 购买F5 BIG-IP ,NetScaler等硬件负载均衡交换机需要10多万甚至几十万人民币。而Nginx为开源软件,可以免费试用,并且可用于商业用途。
  4. 内置的健康检查功能:如果Nginx proxy后端的某台服务器宕机了,不会影响前端访问。
  5. 节省带宽,支持gzip压缩。
  6. 稳定性高:用于反向代理(负载均衡),宕机的概率微乎其微。
  7. 支持热部署。在不间断服务的情况下,对软件版本升级。

二、Nginx安装部署

2.1 环境准备

学习环境

操作系统:Centos7.5 X64

四项确认

  1. 确认网络
#使用以下命令检查centos系统能否上网
ping www.baidu.com

    2.确认yum可用

#使用如下命令检查yum源是否可用,出现一堆版本号表示可用。
yum list

    3.确认防火墙关闭

#查看防火墙是否关闭
firewall-cmd --state
#永久关闭防火墙
systemctl disable firewalld.service

   4.确认关闭SELinux安全防护

#进入配置文件
vim /etc/selinux/config
#修改该配置
SELINUX=disabled

一项安装

yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel

参数:

  • gcc:编译依赖gcc环境,c语言的运行环境。
  • pcre:PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 Perl 兼容的正则表达式库。
  • zlib:zlib库提供了很多种压缩和解压缩的方式,Nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
  • Openssl:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

2.2 Nginx下载与安装

下载Nginx源码

官网下载Nginx软件http://Nginx.org

Mainline Version:主线版,是最新版,但未经过过多的生产测试。

Stable Version:稳定版,生产环境使用版本。

Legacy Version:老版本。

注意:

我们需要下载的是 Stable Version。其中又分为两种版本:Linux 版与 Windows 版。开发时这两个版本我们都下载。Linux 版用于生产环境,而 Windows 版用于开发测试,选择需要的版本进行下载。

在虚拟机中下载源码

wget https://nginx.org/download/nginx-1.20.2.tar.gz

解压文件到usr/local目录下

tar -zxvf nginx-1.20.2.tar.gz -C /usr/local

其中各个目录中存放的文件作用为:

auto:存放 Nginx 自动安装的相关文件

conf:存放 Nginx 服务器配置文件

configure:命令,用于对即将安装的软件的配置,完成 makefile 编译文件的生成

contrib:存放由其他机构贡献的文档材料

html:存放 Nginx 欢迎页面

man:manual,手册,存放 Nginx 帮助文档

src:存放 Nginx 源码

configure 参数:

--prefix:Nginx 安装目录。注意,安装目录与解压目录不一样

--sbin-path:Nginx 命令文件

--modules-path:Nginx 模块存放路径

--conf-prefix:Nginx 配置文件存放路径

--pid-path:Nginx 的进程 id 文件

--error-log-path:错误日志文件

--http-log-path:http访问日志文件

配置ngix参数

#创建目录
[root@node1 Nginx-1.20.1]# mkdir -p /var/temp/nginx/client
#配置参数
[root@node1 Nginx-1.20.1]# ./configure \
--prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi

编译

make

安装

make install

如果出现ngnix文件就表示ngix安装成功啦!

2.3 Nginx目录详解

conf目录

Nginx所有配置文件的目录,极其重要。在该目录中包含一个Nginx.conf配置文件。

[root@node1 Nginx]# ll conf/
总用量 68
-rw-r--r-- 1 root root 1077 8月 27 15:37 fastcgi.conf
-rw-r--r-- 1 root root 1077 8月 27 15:37 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 8月 27 15:37 fastcgi_params
-rw-r--r-- 1 root root 1007 8月 27 15:37 fastcgi_params.default
-rw-r--r-- 1 root root 2837 8月 27 15:37 koi-utf
-rw-r--r-- 1 root root 2223 8月 27 15:37 koi-win
-rw-r--r-- 1 root root 5231 8月 27 15:37 mime.types
-rw-r--r-- 1 root root 5231 8月 27 15:37 mime.types.default
-rw-r--r-- 1 root root 2656 8月 27 15:37 Nginx.conf
-rw-r--r-- 1 root root 2656 8月 27 15:37 Nginx.conf.default
-rw-r--r-- 1 root root 636 8月 27 15:37 scgi_params
-rw-r--r-- 1 root root 636 8月 27 15:37 scgi_params.default
-rw-r--r-- 1 root root 664 8月 27 15:37 uwsgi_params
-rw-r--r-- 1 root root 664 8月 27 15:37 uwsgi_params.default
-rw-r--r-- 1 root root 3610 8月 27 15:37 win-utf

html目录

Nginx的默认站点目录。

[root@node1 Nginx]# ll html/
总用量 8
-rw-r--r-- 1 root root 494 8月 27 15:37 50x.html #错误提示页面
-rw-r--r-- 1 root root 612 8月 27 15:37 index.html #访问Nginx时的首页

logs目录

存放Nginx的日志文件。 access.log error.log

#刚安装完Nginx,从未启动过的话logs目录下什么都没有,只有启动Nginx后,才会出现以下三个文件
[root@node1 Nginx]# ll logs/
总用量 4
-rw-r--r-- 1 root root 0 8月 27 16:29 access.log #记录正常访问的日志
-rw-r--r-- 1 root root 0 8月 27 16:29 error.log #错误日志
-rw-r--r-- 1 root root 6 8月 27 16:29 Nginx.pid #Nginx进程id
[root@node1 Nginx]# cat logs/Nginx.pid 
24514 #当前启动Nginx的master进程的id

sbin目录

Nginx命令的目录,如Nginx的启动命令。

[root@node1 Nginx]# ll sbin/
总用量 5884
-rwxr-xr-x 1 root root 6023208 8月 27 15:37 Nginx #启动关闭等操作的脚本
[root@node1 Nginx]# ./sbin/Nginx #启动Nginx
[root@node1 Nginx]# ps aux|grep Nginx #查看Nginx的进程
root   24514 0.0 0.1 45996 1136 ?     Ss  16:29  0:00 Nginx: master process ./sbin/Nginx
nobody  24515 0.0 0.1 46444 1876 ?     S  16:29  0:00 Nginx: worker process

2.4 Docker安装Nginx服务

拉取官方的Nginx镜像

docker pull nginx

创建并运行Nginx容器

docker run --rm --name nginx-test -p 8080:80 -d nginx

参数的含义如下:

--rm:容器终止运行后,自动删除容器文件。

--name nginx-test:容器的名字叫做Nginx-test,名字自己定义.

-p: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口

-d:容器启动后,在后台运行

Nginx 服务部署,映射本地目录到Nginx容器

创建本地目录,用于存放Nginx的相关文件信息.

mkdir -p /opt/nginx/html  /opt/nginx/conf

参数:

  • html: 目录将映射为 nginx 容器配置的虚拟目录。
  • conf: 目录里的配置文件将映射为 nginx 容器的配置文件。

拷贝容器内 Nginx 默认配置文件到本地当前目录下的 conf 目录,容器ID可以查看 docker ps 命令输入中的第一列

docker cp 08a37:/etc/nginx/nginx.conf /home/nginx/conf/

08a37是nginx容器的前几位id

部署命令

docker run --rm -d -p 8081:80 --name nginx-test-web \
  -v /opt/nginx/html:/usr/share/nginx/html \
  -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  nginx

命令说明:

  • --rm:容器终止运行后,自动删除容器文件。
  • -p 8081:80: 将容器的 80 端口映射到主机的 8082 端口.
  • --name nginx-test-web:将容器命名为 Nginx-test-web
  • -v /home/Nginx/html:/usr/share/Nginx/html:将我们自己创建的 html目录挂载到容器的 /usr/share/Nginx/html。
  • -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:将我们自己创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf。

因为nginx配置较多,因此在后期的学习中使用的是源码的方式使用nginx。

2.5 Nginx启停服务

Nginx服务的启动

在Linux 平台下,启动Nginx服务器直接运行安装目录下sbin目录中的二进制文件即可。

./nginx (-h) #参数可选

参数:

  • -v : 打印版本号
  • -V : 打印版本号和配置
  • -t:测试配置正确性并退出
  • -q:测试配置时只显示错误
  • -s:向主进程发送信号
  • -p:指定Nginx服务器路径前缀
  • -c: 指定Nginx配置文件路径
  • -g: 指定Nginx附加配置文件路径

查看nginx进程

ps -ef | grep nginx

在浏览器中打开nginx服务器

nginx服务默认占用的端口是80

nginx已经启动。

Nginx服务的停止

快速停止,快速停止是指立即停止当前Nginx服务正在处理的所有网络请求,马上丢弃连接,停止工作。

./nginx -s stop   # 快速关闭

平缓停止,平缓停止是指允许Nginx服务将当前正在处理的网络请求处理完成,但不再接收新的请求,之后关闭连接,停止工作。

./nginx -s quit   # 等待工作进程处理完成后关闭

Nginx服务的重启

更改Nginx服务器的配置和加入新模块后,如果希望当前的Nginx服务应用新的配置或使新模块生效,就需要重启Nginx服务。当然我们可以先关闭Nginx服务,然后使用新的Nginx配置文件重启服务。

./nginx -s reload  # 向主进程发送信号,重新加载配置文件,热重启
./nginx -s reopen  # 重启 Nginx

三、Nginx配置指令详解

最核心的配置文件是/nginx/conf/nginx.conf 文件

3.1 全局块配置详解

配置运行Nginx服务器用户(组)

用于配置运行Nginx服务器用户(组)的指令是user。

user zj  zj;   #表示将nginx的生杀大权交给了zj用户zj组

注意:

只有被设置的用户或者用户组成员才有权限启动你那个Nginx进程,如果是其他用户尝试启动Nginx进程,将报错

如果希望所有用户都可以启动Nginx进程,有两种办法:一是将次指令注释:

# user zj zj;

或者把用户(和用户组)设置为nobody;

user nobody nobody;

注意:

在Nginx配置文件中,每一条指令配置必须以分号结束,请不要忘记。

配置允许生成worker process数

worker process是Nginx服务器实现并发处理的关键所在。理论来说worker_process的值越大,可以支持的并发处理也越多。

worker_process number | auto

参数:

  • number 指定Nginx进程最多可以产生的worker_process数。其值通常设置为电脑CPU的个数或者倍数。
  • auto ,设置此值,Nginx进程将自动检测。

在默认的配置文件中,Number=1.启动Nginx服务器后,使用以下命令可以看出Nginx服务器除了主进程master process ../sbin/Nginx之外,还生成了一个worker_process。

ps aux|grep nginx

配置Nginx进程PID存放路径

Nginx进程作为系统的守护进程运行,我们需要在某文件中保存当前运行程序的主进程号。

pid file;

注意:

次指令只能在全局快中设置。 在指令path的时候,一定要包括文件名,如果只设置了路径,没有设置文件名,会报错。

配置错误日志的存放路径

在全局块、http块和 server 块中都可以对Nginx服务器的日志进行相关配置。这里首先介绍全局块下日志的存放配置,后两种情况的配置基本相同,只是作用域不同。

error_log_file | stderr[ debug|info | notice| warn |error|crit|alert]

注意:

指定的文件对于运行Nginx进程的用户具有写权限,否则在启动Nginx进程的时候会出现以下报错信息:

Nginx:[alert] :could not open error log file :open() "/Nginx/logs/error.log failed (permission denied)"

配置文件的引入

在一些情况下,我们可能需要将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中。Nginx 提供了include指令来完成配置文件的引入。

include file;

其中,file是要引入的配置文件,它支持相对路径。

注意: 新引用进来的文件同样要求运行Nginx进程的用户对其具有写权限,并且符合Nginx配置文件规定的相关语法和结构。此指令可以放在配置文件的任意地方。

3.2 events块配置详解

配置事件驱动模型

Nginx服务器提供了多种事件驱动模型来处理网络消息。配置文件中为我们提供了相关的指令来强制Nginx服务器选择哪种事件驱动模型进行消息处理。

use method;

其中,method可选择的内容有: select、poll、kqueue、epoll、rtsig、ldev/poll l以及 eventport。

标准事件模型:

  • Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,Nginx会选择select或poll

高效事件模型:

  • Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
  • Epoll:多路IO复用高性能网络模型,使用于Linux内核2.6版本及以后的系统。
  • /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
  • Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

注意:

可以在编译时使用--with-select module和--without-select_module设置是否强制编译select模块到Nginx 内核;使用--with-poll_module和--without-poll_module设置是否强制编译poll模块到Nginx内核。此指令只能在events块中进行配置。

配置最大连接数

指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数。其语法结构为

worker_connections number;

此指令的默认设置为512。

注意: 每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台Nginx服务器的最大连接数为 worker_processes * worker_connections

3.3 HTTP块配置详解

定义MIME-Type

在常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。

include    mime.types;     #mime.types是nginx目录下的一个配置文件
default_type  application/octet-stream;   #默认类型

看下mime.types片段:

自定义服务日志

记录Nginx服务器提供服务过程应答前端请求的日志,我们将其称为服务日志以示区分。 Nginx服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是access _log 和 log_format指令。

access_log 指令的语法结构为:

access_log path[format[buffer=size]]
  • path,配置服务日志的文件存放的路径和名称。
  • format,可选项,自定义服务日志的格式字符串,也可以通过“格式串的名称”使log_format指令定义好的格式。“格式串的名称”在 log_format 指令中定义。
  • size,配置临时存放日志的内存缓存区大小。

和access_log联合使用的另一个指令是log_format,它专门用于定义服务日志的格式,并且可以为格式字符串定义一个名字,以便access_log 指令可以直接调用。其语法格式为:

log_format name string ..;
  • name,格式字符串的名字,默认的名字为combined。
  • string,服务日志的格式字符串。在定义过程中,可以使用Nginx 配置预设的一些变量获取相关内容,变量的名称使用双引号括起来,string整体使用单引号括起来。

日志格式:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

 

日志格式设置 :

$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地址和原来客户端的请求的服务器地址。

配置连接超时时间

与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间,指令 keepalive_timeout就是用来设置此时间的。

keepalive_timeout timeout [header timeout];
  • timeout,服务器端对连接的保持时间。默认值为75s。
  • header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间"Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。
    配置示例:
keepalive_timeout 120s 100s;

其含义是,在服务器端保持连接的时间设置为120 s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100 s。

注意:

此指令还可以出现在server块和 location块中。

配置虚拟主机

server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点)

server{
}

配置网络监听

配置监听使用指令listen,其配置方法主要有二种。

第一种配置监听的IP地址

listen address[:port]

第二种配置监听端口

listen port;

参数:

  • address,IP地址,如果是IPv6的地址,需要使用中括号“[”括起来,比如[fe80::1]等。
  • port,端口号,如果只定义了IP地址没有定义端口号,就使用80端口。

示例:

listen 192.168.1.10:8000; #监听具体的IP和具体的端口上的连接

listen 192.168.1.10; #监听具体IP的所有端口上的连接(没用)

listen 8000; #监听具体端口上的所有IP连接

基于名称虚拟主机配置

这里的“主机”,就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好 DNS,用户就可以使用这个名称向此虚拟主机发送请求了。

server_name  name1  name2 name3 ...;
server_name  www.baidu.com     //精确匹配
server_name  *.baidu.com;       //通配
server_name  www.baidu.com  *baidu.com;

四种写法:

server_name www.baidu.com;

server_name *.baidu.com;

server_name www.baidu.*;

server_name ~^www\.baidu\.*$;

优先级

3.4 配置总结

#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;
#全局错误日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid     logs/Nginx.pid;
#工作模式及连接数上限
events {
   #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
   #仅用于linux2.6以上内核,可以大大提高Nginx的性能
   use  epoll; 
   #单个worker进程的最大并发链接数  
   worker_connections  1024;
   # 并发总数是 worker_processes 和 worker_connections 的乘积
   # 即 max_clients = worker_processes * worker_connections
   # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4  为什么
   # 为什么上面反向代理要除以4,应该说是一个经验值
   # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
   # worker_connections 值的设置跟物理内存大小有关
   # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
   # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
   # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
   # $ cat /proc/sys/fs/file-max
   # 输出 34336
   # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
   # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
   # 使得并发总数小于操作系统可以打开的最大文件数目
   # 其实质也就是根据主机的物理CPU和内存进行配置
   # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
   # ulimit -SHn 65535
}
http {
   #设定mime类型,类型由mime.type文件定义
   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 指令指定 Nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
   #对于普通应用,必须设为 on,
   #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
   #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
   sendfile   on;
   #tcp_nopush   on;
   #连接超时时间
   #keepalive_timeout  0;
   keepalive_timeout  65;
   tcp_nodelay   on;
   #开启gzip压缩
   gzip  on;
   gzip_disable "MSIE [1-6].";
   #设定请求缓冲
   client_header_buffer_size   128k;
   large_client_header_buffers  4 128k;
   #设定虚拟主机配置
   server {
     #侦听80端口
     listen   80;
     #定义使用 www.Nginx.cn访问
     server_name  www.Nginx.cn;
     #定义服务器的默认网站根目录位置(编译的时候--prefix是整个Nginx的根目录,这里的html文件夹是相对--prefix的路径)
     root html;
     #设定本虚拟主机的访问日志
     access_log  logs/Nginx.access.log  main;
     #默认请求
     location / {
       #定义首页索引文件的名称
       index index.php index.html index.htm;  
     }
     # 定义错误提示页面
     error_page  500 502 503 504 /50x.html;
     location = /50x.html {
     }
     #静态文件,Nginx自己处理
     location ~ ^/(images|javascript|js|css|flash|media|static)/ {
       #过期30天,静态文件不怎么更新,过期可以设大一点,
       #如果频繁更新,则可以设置得小一点。
       expires 30d;
     }
     #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
     location ~ .php$ {
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_index index.php;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include fastcgi_params;
     }
     #禁止访问 .htxxx 文件
       location ~ /.ht {
       deny all;
     }
   }
}

3.4 location指令

location以来处理不同的请求 。

配置location块

URL  // http://ip:port/
location [ = | ~ | ~* | ^~] uri { 
    ... 
}
匹配规则 含义 示例
= 精确匹配 location = /images/ {...}
~ 正则匹配,区分大小写 location ~ .(jpg | gif)$ {...}
~* 正则匹配,不区分大小写 location ~* .(jpg | jif)$ {...}
^~ 匹配到即停止搜索 location ^~ /images/ {...}
不带任何符号 location / {...}

示例1:没有修饰符

没有修饰符 表示:必须以指定模式开始,如:

server {
  server_name *.*;
  location  /abc {
    ……
  }
}
#注意  /abc 前后都存在空格

表示访问的路径中只要包含/abc就能访问到{}中的资源根路径。

注意如下是对的:

http://baidu.com/abc

http://baidu.com/abc?p1=12312&name=w24

http://baidu.com/abc/

http://baidu.com/abcde

示例2:=

= 表示:必须与指定的模式精确匹配

server {
   server_name *.*;
  location = /abc {
    ……
  }
}

就是说浏览器必须访问192.168.66.100/abc才能访问到资源的根路径。

那么,如下是对的:

192.168.66.100/abc

192.168.66.100/abc?p1

如下是错的:

 http://192.168.66.100/abc/ 

192.168.66.100/abcde

示例3:~

~ 表示:指定的正则表达式要区分大小写

server {
  server_name *.*;
  location ~ ^/abc$ {
    ……
  }
}

 ~ ^/abc$表示匹配的路径只能是小写的abc

注意:

对的

192.168.66.100/abc

192.168.66.100/abc?name=wcc&password=123

错误

192.168.66.100/ABC

192.168.66.100/abc/

192.168.66.100/abcde

示例4:~*

~* 表示:指定的正则表达式不区分大小写

server {
server_name *.*;
location ~* ^/abc$ {
    ……
  }
}

注意:

那么,如下是对的:

192.168.66.100/abc

192.168.66.100/ABC

192.168.66.100/abc?p1=11&p2=22

如下是错的:

192.168.66.100/abc/

192.168.66.100/abcde

优先级

location  = / {
  # 只匹配请求 "/"
  [ configuration A ] 
}
location  / {
  # 匹配任何请求,因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配
  [ configuration B ] 
}
location /documents/ {
  # 匹配所有 /documents/ 开头的请求,在没有正则表达
  # 式匹配时选择该locaiton
  [ configuration C ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配其它location
  [ configuration D ] 
}
location ~* .(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration D]处理.  
  [ configuration E ] 
}

结论:

  1. / -> 匹配A
  2. /index.html -> 匹配B
  3. /documents/a.html -> 匹配C
  4. /images/1.gif -> 匹配D
  5. /documents/1.jpg -> 匹配E

配置请求的根目录

Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在Nginx服务器中,指令root就是用来配置这个根目录的。

root path;

例如:

server {
        #设置nginx端口号
        listen       80;
        server_name  localhost;
        #设置匹配规则
        location / {
            root   html;
            index  index.html index.htm;
        }
        ……
      }

这里的html实际上是nginx根目录下的html文件。这是一种相对路径的指定方式,当然我们还可以使用绝对路径指定资源的位置。

配置完成后需要重启nginx使配置生效一下:

[root@localhost sbin]# ./nginx -s reload

此时,我们在访问192.168.66.100:80的时候,nginx会根据配置定位到html目录,此时在访问路径后面加上资源的名称,即可访问html目录下的相关的资源。例如:192.168.66.100:80/dog.png 表示访问的是html目录下的dog.png


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
3月前
|
负载均衡 安全 应用服务中间件
高并发下Nginx安全配置
【8月更文挑战第16天】这段Nginx配置强化了安全性,包括隐藏版本信息以防攻击者利用,设置IP白/黑名单控制访问权限,保护敏感文件如日志不被非法下载,并启用HTTPS加密通信保障数据安全。同时,通过优化Nginx配置及系统内核参数,如调整进程数、并发连接数及文件描述符限制,显著提升服务器性能与稳定性。最后使用ApacheBench工具验证配置的有效性。
57 5
|
24天前
|
NoSQL Java Redis
京东双十一高并发场景下的分布式锁性能优化
【10月更文挑战第20天】在电商领域,尤其是像京东双十一这样的大促活动,系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新,如果处理不当,很容易出现库存超卖、数据不一致等问题。
42 1
|
5月前
|
消息中间件 数据挖掘 程序员
【建议收藏】高并发下的分布式事务:如何选择最优方案?
本文介绍了分布式事务的三种常见解决方案。在分布式系统中,事务处理变得复杂,需确保ACID特性。TCC(Try-Confirm-Cancel)方案适用于严格资金要求的场景,如银行转账,通过预留、确认和取消步骤确保一致性。可靠消息最终一致性方案适合一致性要求较低的场景,如电商积分处理,通过消息中间件实现最终一致性。最大努力通知方案则用于允许不一致的场景,如数据分析,通过重复通知尽可能达成一致性。选择合适的方案取决于具体应用场景。
152 5
|
1月前
|
NoSQL Java Redis
Redlock分布式锁高并发下有什么问题
Redlock分布式锁在高并发场景下可能面临的问题主要包括:网络延迟、时钟偏移、单点故障、宕机重启问题、脑裂问题以及效率低等。接下来,我将使用Java代码示例来说明其中一些问题。
83 12
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
56 4
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
53 3
|
3月前
|
监控 网络协议 应用服务中间件
高并发下Nginx压缩
【8月更文挑战第16天】gzip压缩在Nginx中可减少传输数据量,加快响应速度但消耗CPU。可在http、server及location级别配置。高并发时,启用Nginx状态监控以检查性能,配置`nginx.conf`添加`location /NginxStatus { stub_status on; access_log off; }`并重启Nginx
52 12
|
3月前
|
消息中间件 负载均衡 应用服务中间件
高并发环境下的Nginx整合方案
【8月更文挑战第20天】在高并发环境下,整合Nginx代理服务器、静态文件服务器、Tomcat集群、Mycat数据库读写分离和消息队列,可以构建一个强大、灵活且可扩展的Web服务架构。
45 1
|
3月前
|
应用服务中间件 Linux nginx
高并发下Nginx配置限流
【8月更文挑战第16天】
74 1

热门文章

最新文章