Nginx服务器

1、概述

概述

Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
在这里插入图片描述
目前电商和互联网系统都会采用nginx + 应用服务器(tomcat).
Web服务器分2类:
1、web服务器
a)Apache 服务器
b)Nginx
c)IIS 微软件提供的服务器
2、web应用服务器
a)tomcat
b)resin
c)jetty
区分:web服务器不能解析jsp等页面,只能处理js、css、html等静态资源。
并发:web服务器的并发能力远高于web应用服务器。

nginx:
轻量级,同样起web 服务,比apache 占用更少的内存及资源
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单
社区活跃,各种高性能模块出品迅速
apache:
rewrite ,比nginx 的rewrite 强大
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多
稳定 .

为什么要选择Nginx

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应.

作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。把请求平均分配到处理请求的服务器上

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。

Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

案例:
新浪网:
在这里插入图片描述
在这里插入图片描述
淘宝
在这里插入图片描述
在这里插入图片描述

开发阶段中的环境

开发环境:自己的电脑
测试环境:提供给测试人员使用的环境
生产环境:项目最终发布上线的环境
预发布环境:数据是和生产环境的数据一致,运行最新的项目代码进去测试

每个环境的访问地址是不同的,可能因为访问地址不同导致一些问题的产生,所以,为了避免该类问题的产生,可以使不同的环境访问地址完全一致,通过域名访问即可实现。

Localhost和127.0.0.1区别?

2、hosts文件

需求:如何通过域名访问后台系统?

现在:http://localhost:8080/AppInfoSystem
需要通过www.wuligang.com访问。

http://www.wuligang.com:8080/AppInfoSystem

Hosts

用户访问后台:

用户 www.wuligang.com 本机的hosts文件中查找域名映射,如果查找到就返回 浏览器通过域名到DNS查找服务器ip地址 执行访问

Linux下的hosts文件所在路径: /etc/hosts

Win下的host: C:\Windows\System32\drivers\etc

在这里插入图片描述

实现

1、修改本地的hosts,将http://www.gzh.com/ 映射到127.0.0.1。–通过工具软件switchHosts可以很方便的修改;
在这里插入图片描述
效果:
在这里插入图片描述
不想用端口号则将端口换为80
若被占用,则在cmd中输入

1.查找本地的某个端口被哪个进程占用
  以8888端口为例,在命令行中输入:
  netstat -aon|findstr “80”
  2.利用PID号查看该进程属于哪个程序
  由上一步得知,PID号是59576,则输入
  tasklist|findstr 59576
  3.把该程序结束
  由上一步得知,确实是VisualSVNServer.exe在占用这个端口,因此我们将其直接关掉。命令行中输入:
  taskkill /f /t /im VisualSVNServer.exe

在这里插入图片描述
则再运行程序:无端口号
在这里插入图片描述

3、Nginx安装配置

配置nginx

windows:下载nginx-1.xx.x.zip解压得到:–注意路径中不要包含中文

在这里插入图片描述
启动nginx:
双击nginx.exe 或 cmd执行start nginx命令
在这里插入图片描述
三个命令:(在 CMD 中执行)
启动:start nginx.exe
停止:nginx.exe -s stop
重新加载:nginx.exe -s reload

只有2个进程nginx才算是真正的启动成功:
在这里插入图片描述
注意:进程开多了配置会失效
杀死进程命令:taskkill /f /t /im nginx.exe

Linux安装

环境准备:
一. gcc 安装
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++

二. PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel

三. zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel

四. OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel

五.下载:
官网下载,直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html
或者
使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装。
wget -c https://nginx.org/download/nginx-1.18.0.tar.gz

上传,上传到服务器的/usr/local
解压

依然是直接命令:
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
使用默认配置
./configure
编译安装
make & make install

启动、停止nginx
cd /usr/local/nginx/sbin/
./nginx
./nginx -s stop
./nginx -s quit
./nginx -s reload

Nginx的配置文件

Nginx的核心配置都在nginx.conf里面
示例:
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ‘ r e m o t e a d d r – remote_addr– remoteaddrremote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for’; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。

upstream mysvr {   
  server 127.0.0.1:7878;
  server 192.168.10.121:3333 backup;  #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
    keepalive_requests 120; #单连接请求上限次数。
    listen       4545;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
       #root path;  #根目录
       #index vv.txt;  #设置默认页
       proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
       deny 127.0.0.1;  #拒绝的ip
       allow 172.18.5.54; #允许的ip           
    } 
}

}

上面是nginx的基本配置,需要注意的有以下几点:
1、1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址; 2.$remote_user :用来记录客户端用户名称; 3.$time_local : 用来记录访问时间与时区;4.$request : 用来记录请求的url与http协议;
5.$status : 用来记录请求状态;成功是200, 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;7.$http_referer :用来记录从那个页面链接访问过来的; 8.$http_user_agent :记录客户端浏览器的相关信息;
2、惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。
3、每个指令必须有分号结束

Location语法

= 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~* 不区分大小写匹配(可用正则表达式)
!~ 区分大小写不匹配
!~* 不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式

为了方便学习,安装echo模块:
下载:https://github.com/openresty/echo-nginx-module/tags
在这里插入图片描述
上传到nginx同目录下并解压:tar -zxvf echo-nginx-module-0.62.tar.gz
cd nginx-1.18.0/
先停止服务
执行:./configure --add-module=/usr/local/echo-nginx-module-0.62
编译:make
复制:cp objs/nginx …/nginx/sbin/
再次启动即可

优先级

server {
        listen       80;
        server_name  localhost;
		# /表示所有请求都过滤,优先级最低
        location / {
            #root   html;
            #index  index.html index.htm;
			echo "hello nginx";
        }
		# =表示精确匹配,优先级最高
		location = /a {
			echo "/a";
		}
		
		#^~代表以xxx开始,第二优先
		location ^~ /a {
			echo "^~ /a";
		}
		
		#~代表正则匹配,第三优先
		location ~ /[0-9] {
			echo "~ /[0-9]";
		}
    }

安装curl:yum install curl
测试:curl http://localhost/路径

4、Nginx的应用场景

1.静态服务器
2.虚拟主机
3.反向代理
4.负载均衡

静态服务器

静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html、css、js)、图片(jpeg、gif、png)、视频文件(flv、mpeg)、其他文件(TXT等任意下载文件)。
配置:

server {
listen       80; 
server_name  www.wuligang.com; 
location / {
root   html;
index  index.html index.htm;
}
}

这样配置,当访问http://www.baidu.com的时候,就会跳跳转到/nginx/sbin/nginx/html/index.html页面,前提是配置了当前主机的host,设置当访问www.baidu.com的时候跳转到服务器的ip。

虚拟主机

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录
配置的时候和静态资源服务器配置方法一致,只需要多添加一个server节点,保证访问的url不一样就可以了。

server {
listen       80;
server_name  www.wuligang.com;
location / {
root   html; 
index  index.html index.htm; 
}
}
server { 
listen       88; 
server_name  www.gangliwu.com; 
location / {  
root   html2; 
index  index2.html index.htm;
}
}

反向代理

为什么使用代理服务器
1)提高访问速度
由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门网站能明显提高访问速度。

2)防火墙作用
由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以在代理服务器上设限,过滤掉某些不安全信息。同时正向代理中上网者可以隐藏自己的IP,免受攻击。

3)突破访问限制
互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,可以直接访问外网。
正向代理:
正向代理(forward proxy) ,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并制定目标(原始服务器),然后代理向原始服务器转发请求并将获得的内容返回给客户端,客户端才能使用正向代理。我们平时说的代理就是指正向代理。
简单一点:A向C借钱,由于一些情况不能直接向C借钱,于是A想了一个办法,他让B去向C借钱,这样B就代替A向C借钱,A就得到了C的钱,C并不知道A的存在,B就充当了A的代理人的角色。

反向代理:用户nginxtomcat
反向代理(Reverse Proxy),以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求的客户端,此时代理服务器对外表现为一个反向代理服务器。
理解起来有些抽象,可以这么说:A向B借钱,B没有拿自己的钱,而是悄悄地向C借钱,拿到钱之后再交给A,A以为是B的钱,他并不知道C的存在。
在这里插入图片描述

server{
listen       80;
server_name www.wuligang.com;

location /{
#tomcat服务器
proxy_pass http://192.168.60.198:8080; 
}
}

这样,当访问www.wuligang.com,就会跳转到http://192.168.60.198:8080上,这就是一个最简单的反向代理的例子

负载均衡

由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。
针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。
1)一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的
2)一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略.
nginx的负载均衡是通过它的反向代理能力实现的。

upstream tomcatserver {
        server  127.0.0.1:8080 weight=1;
        server  127.0.0.1:8081 weight=2;
}
server{
listen       80;
server_name www.wuligang.com;

location /{
proxy_pass http://tomcatserver;
}
}

这样,当访问本地的80端口的时候,会采用轮询的方法跳转到8080端口和8081端口,其中8081端口的权重为8080端口的两倍,就是8081被访问两次,8080会被访问一次。

nginx支持的负载均衡调度算法方式:

1.weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
2.least_conn:最少连接,将新请求分发给不太繁忙的服务器,避免服务器过载
3.ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
4.fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
5.url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包

总结:

使用了nginx的请求模型:

用户 Nginx tomcat
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单眼皮女孩i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值