Nginx的简单了解与使用
一、产生背景
我们日常生活中经常遇到的问题


这是几年前的12306,现在的12306基本上不会出现这样的问题了

上述场景产生的主要 2 大原因:
1.巨大流量
2.单台服务器资源和能力有限在海量并发的环境下,用户每一次请求服务器,都需要大量的创建线程,每一次的线程都必须分配资源(CPU、内存、带宽、磁盘 IO等),当资源不足的时候就会使得服务器宕机而无法提供服务。
那么如何保证网站在流量峰值时能够顺利运作???
二、 负载均衡(Load Balance)
在阐述负载均衡之前先解释一下高并发的概念。
2-1、 、 高并发
见名知意,高(大量的),并发就是可以使用多个线程或者多个进程,同时处理(就是并发)不同的操作。简而言之就是每秒内有多少个请求同时访问。
2-2 、负载均衡
负载均衡:将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】,也是分布式系统架构设计中必须考虑的因素之一。
2-3 、tomcat 并发图

有 tomcat 的并发测试图可以发现,当每秒 300 个请求同时访问tomcat 时,tomcat 已经开始承受不住,出现波动。那么大型网站是如何处理高并发的呢?以下是高并发场景下,实现负载均衡的一个分布式架构图

常见互联网分布式架构,分为客户端层、反向代理 nginx 层、站点层、服务层、数据层。只需要实现“将 请求/ / 数据 均匀分摊到多个操作单元上执行”,就能实现负载均衡
三、 Nginx的初探
1 、什么是 Nginx? ?
Nginx 是一款轻量级的 Web 服务器/ 反向代理服务器【后面有介绍】及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev 所开发,其特点是占有内存少,并发能力强,nginx 的并发能力确实在同类型的网页服务器中表现非常好。
•2004 年 10 月 4 日 第一个公开版本 0.1.0 发布。其将源代码以类 BSD 许可证的形式发布。
•官方测试 nginx 能够支撑 5 5 万并发链接,并且 CPU、内存等资消耗却非常低,运行非常稳定。
四、Nginx 纵深对比其优缺点
什么不讲 Apache ,反而讲 Nginx ???
•Nginx 和 apache 的优缺点
1.nginx 相对于 apache 的优点:
轻量级,同样起 web 服务,比 apache 占用更少的内存及资源高并发,nginx 处理请求是 异步非阻塞(如前端 ajax)的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单还有,它社区活跃,各种高性能模块出品迅速(十几年时间发展)
2.apache 相对于 nginx 的优点:
Rewrite 重写 ,比 nginx 的 rewrite 强大模块超多,基本想到的都可以找到少 bug ,nginx 的 bug 相对较多。(出身好起步高)
3.Nginx 配置简洁, Apache 复杂
五、安装 Nginx
5-1 、安装依赖
依赖 gcc openssl-devel pcre-devel zlib-devel
安装:yum -y install gcc openssl-devel pcre-devel zlib-devel

解压文件

5-3 、configure配置
进入解压后的源码目录,然后执行 configure 命令进行配置
./configure --prefix=/usr/soft/nginx

5-4、 编译并安装
make && make install

安装好后,会在/usr/soft 下生成 nginx 目录(这是我编译前指定的),这个目录就是 nginx 的软件了。

5-5 、nginx命令

一旦 nginx 启动,就可以通过调用带有 -s 参数的可执行文件来控制它。使用语法: nginx -s 信号可以是下列之一:
stop - 快速关机
quit - 优雅的关机
reload - 重新加载配置文件
reopen - 重新打开日志文件
例如,要停止 nginx 进程并等待工作进程完成当前请求的服务,可以执行以下命令:nginx -s qui(注意进入sbin目录下执行命令)
六、Nginx配置
6-1 、nginx配置详解
#进程数,建议设置和 CPU 个数一样或 2 倍
worker_processes 2;
#日志级别
error_log logs/error.log warning;(默认 error 级别)
# nginx 启动后的 pid 存放位置
#pid logs/nginx.pid;
events {
#配置每个进程的连接数,总的连接数= worker_processes * worker_connections
# 根据物理内存大小来配置,默认 1024
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#连接超时时间,单位秒
keepalive_timeout 65;
server {
listen 80;
server_name localhost
#默认请求
location / {
root html; #定义服务器的默认网站根目录位置
index index.php index.html index.htm; #定义首页索引文件的名称
}
#定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
6-2、 、 负债均衡配置:
nginx 支持以下负载均衡机制(或方法):
a) 循环 - 对应用程序服务器的请求以循环方式分发,
b) 最少连接数 - 将下一个请求分配给活动连接数最少的服务器
c) ip-hash - 哈希函数用于确定下一个请求(基于客户端的 IP地址)应该选择哪个服务器。
6-2-1 默认负载平衡配置 默认负载平衡配置
使用 nginx 进行负载平衡的最简单配置可能如下所示:
http {
upstream shsxt{
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://shsxt;
}
}
}
在上面的示例中,在 srv1-srv3 上运行相同应用程序的 3 个实例。如果没有专门配置负载均衡方法,则默认为循环法。所有请求都被 代理到服务器组 shsxt,并且 nginx 应用 HTTP 负载平衡来分发请求。

6-2-2 加权负载平衡
通过使用服务器权重,还可以进一步影响 nginx 负载均衡算法,谁的权
重越大,分发到的请求就越多。
upstream shsxt {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
6-2-3 最少连接负载平衡
在连接负载最少的情况下,nginx 会尽量避免将过多的请求分发给繁忙
的应用程序服务器,而是将新请求分发给不太繁忙的服务器,避免服务
器过载。
upstream shsxt {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
6-2-4 会话持久性
上述的循环或最少连接数的负载平衡方法,每个后续客户端的请求都可能被分发到不同的服务器。不能保证相同的客户端总是定向到相同的服务器。
如果需要将客户端绑定到特定的应用程序服务器 - 换句话说,就是始终选择相同的服务器而言,就要使客户端的会话“粘滞”或“持久” 。ip-hash 负载平衡机制就是有这种特性。使用 ip-hash,客户端的 IP 地址将用作散列键,以确定应该为客户端的请求选择服务器组中的哪台服务器。此方法可确保来自同一客户端的请求将始终定向到同一台服务器,除非此服务器不可用。
upstream shsxt{
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
6-3 Nginx 的访问控制
Nginx 还可以对 IP 的访问进行控制,allow 代表允许,deny 代表禁止.
location / {
deny 192.168.78.1;
allow 192.168.78.0/24;
allow 10.1.1.0/16;
allow 192.168.1.0/32;
deny all;
proxy_pass http://shsxt;
}
从上到下的顺序,匹配到了便跳出。如上的例子先禁止了 192.168.78.1,接下来允许了 3 个网段,其中包含了一个 ipv6,最后未匹配的 IP 全部禁止访问.
七.虚拟主机
7-1 何为虚拟主机
虚拟主机是指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存
放和传输功能。说白了虚拟主机就是把一台物理服务器划分成多个“虚拟”的服务器,各个虚拟主机之间完全独立,在外界看来,每一台虚拟主机和一台单独的主机的表现完全相同。所以这种被虚拟化的逻辑主机被形象地称为“虚拟主机”。
优点:
由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低。许多企业建立网站都采用这种方法,这样不仅大大节省了购买机器和租用专线的费用,网站服务器服务器管理简单,诸如软件配置、防病毒、防攻击等安全措施都由专业服务商提供,大大简化了服务器管理的复杂性;同时也不必为使用和维护服务器的技术问题担心,更不必聘用专门的管理人员。
类别:
1、基于域名的虚拟主机,通过域名来区分虚拟主机
2、基于端口的虚拟主机,通过端口来区分虚拟主机
3、基于 ip 的虚拟主机,很少用。
7-2 、基于域名的虚拟主机
http {
upstream shsxt{
server srv1.example.com;
server srv2.example.com;
}
upstream bjsxt{
server srv3.example.com;
server srv4.example.com;
}
server {
listen 80;
//访问 sxt2.com 的时候,会把请求导到 bjsxt 的服务器组里
server_name sxt2.com;
location / {
proxy_pass http://bjsxt;
}
}
server {
listen 80;
//访问 sxt1.com 的时候,会把请求导到 shsxt 的服务器组里
server_name sxt1.com;
location / {
proxy_pass http://shsxt;
}
}
}
注意:基于域名的虚拟机主机 在模拟应用场景时,需要在 windows 系统的 hosts文件里配置域名映射。(C:\Windows\System32\drivers\etc\hosts)

如上图所示,将 sxt1 和 sxt2 的域名映射到 nginx 服务器 IP 上。

7-3 、基于端口的虚拟主机
http {
upstream shsxt{
server srv1.example.com;
server srv2.example.com;
}
upstream bjsxt{
server srv3.example.com;
server srv4.example.com;
}
server {
//当访问 nginx 的 80 端口时,将请求导给 bjsxt 组
listen 80;
server_name localhost;
location / {
proxy_pass http://bjsxt;
}
}
server {
//当访问 nginx 的 81 端口时,将请求导给 shsxt 组
listen 81;
server_name localhost;
location / {
proxy_pass http://shsxt;
}
}
}

7-4 、基于ip的虚拟主机
首先创建一个子网卡 ifconfig eth0:1 192.168.179.131

nginx的配置文件



八 、正向代理和反向代理
正向代理
举个栗子:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。像我们经常通过 vpn 访问国外的网站,此时就是正向代理。客户端必须设置正向代理服务器,当然前提是要知道正向代理服的 务器的 IP 地址,还有代理程序的端口。再比如下面的翻墙:

反向代理
•反向代理(Reverse Proxy )方式是指以代理服务器来接受 internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的网址,就像拨打 10086 一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx 就是性能非常好的反向代理服务器,用来做负载均衡。
九、 、Nginx 的 的 session 的一致性问题
http 协议是无状态的,即你连续访问某个网页 100 次和访问 1次对服务器来说是没有区别对待的,因为它记不住你。那么,在一些场合,确实需要服务器记住当前用户怎么办?比
如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session 的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离 http 协议以及任何现有的 web 技术session 的常见实现形式是会话 cookie(session cookie),即未设置过期时间的 cookie,这个 cookie 的默认生命周期为浏览器会
话期间,只要关闭浏览器窗口,cookie 就消失了。
9-1 、Session 共享
– 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 id 在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的 session 数据可能存在其中一台机器,这个时候
就会出现取不到 session 数据的情况,于是 session 的共享就成了一个问题
9-2 、Session 一致性解决方案
– 1、session 复制
– tomcat 本身带有复制 session 的功能。
– 2、共享 session
– 需要专门管理 session 的软件, memcached 缓存服务,可以和 tomcat 整合,帮助 tomcat共享管理 session。
9-3 、安装 memcached
1. 安装 memcached 内存数据库
yum –y install memcached
可以用 telnet localhost 11211
2. web 服务器连接 memcached 的 jar 包拷贝到 tomcat 的 lib
3. 配置 tomcat 的 conf 目录下的 context.xml
<Manager
className="de.javakaffee.web.msm.MemcachedBackupSessionMana
ger"
memcachedNodes="n1:192.168.17.9:11211"
sticky="true"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kr
yo.KryoTranscoderFactory" />
配置 memcachedNodes 属性,配置 memcached 数据库的 ip 和端口,
默认 11211,多个的话用逗号隔开.
目的?让tomcat 服务器从memcached缓存里面拿session 或者是
放 session
4. 修改 index.jsp,取 sessionid 看一看
<%@ page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<html lang="en">
SessionID:<%=session.getId()%>
</br>
SessionIP:<%=request.getServerName()%>
</br>
<h1>tomcat1</h1>
</html>
Nginx的简单了解与使用的更多相关文章
- nginx知识点简单回顾
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- Centos6.7配置Nginx+Tomcat简单整合
系统环境:Centos 6.7 软件环境:JDK-1.8.0_65.Nginx-1.10.3.Tomcat-8.5.8 文档环境:/opt/app/ 存放软件目录,至于mkdir创建文件就不用再说了 ...
- nginx+keepalived简单双机主从热备
双机主从热备概述 可以两台机子互为热备,平时各自负责各自的服务.在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续 ...
- Linux yum的配置 , python环境管理, nginx搭建简单学习
Linux yum的配置 , python环境管理, nginx搭建简单学习 一丶配置yum的数据仓库 ### yum 工具, 方便,自行解决软件之间的依赖关系. # 配置yum源仓库 (可以使用,清 ...
- 以实际的WebGIS例子探讨Nginx的简单配置
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 以实际项目中的一个例子来详细讲解Nginx中的一般配置,其中涉 ...
- nginx 配置管理 - 简单也复杂
由于涉及到h5与后端交互,跨域问题,所以公司的开放测试服务器让我们自己搞nginx.顺便提升一下nginx的实践. nginx的安装,没什么难度了,百度一堆,如果源码安装就一步步来吧.(最简单的方式: ...
- Nginx个人简单理解
首先我们来补充下一些基本知识: 什么是代理服务器? 先举个简单的例子,现在我们在百度访问谷歌的网站,发现现在进不去,这个时候我们可以FQ(关于FQ,可以借鉴下这个博文:http://zhangge.n ...
- Linux下Nginx+PHP 简单安装配置
测试环境 Linux 2.6.18nginx-1.0.4 http://www.nginx.org/php-5.3.6 http://www.php.net/ 一,安装Nginxwget http:/ ...
- nginx日志简单分析工具
自己有个tony6.com的服务器,上面挂着我的博客,web服务器是nginx. 由于最近一直在折腾python,所以简单写了个nginx日志分析工具,它可以分析出每个IP的点击数量和IP所在地. # ...
- Linux安装Nginx以及简单理解
1.Nginx简单介绍 ①.Nginx:一个高性能的HTTP和反向代理服务器,高并发处理很不错. ②.反向代理:在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂 ...
随机推荐
- CentOS7使用yum和源码升级内核
原文:https://blog.csdn.net/bayin4937/article/details/100949870 两种方式升级内核 一.yum升级内核 参考:https://blog.csdn ...
- [CF369E]Valera and Queries_离线_树状数组
Valera and Queries 题目链接:codeforces.com/problemset/problem/369/E 数据范围:略. 题解: 这种题,就单独考虑一次询问即可. 我们发现,包括 ...
- 部署系统报404.有可能是tomcat存在多个进程
今天对需求进行系统升级部署,本以为只需要几分钟的事,结果却遇到了怪事 我是用Jenkins集成部署的,之前都是点一下几分钟就可以了,结果这次部署完成之后 一直报404,一直打不开页面,很无奈,就去 ...
- Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration
由于博客园不支持markdown,推荐以下url阅读: 原创url:https://blog.csdn.net/weixin_42495873/article/details/103364868 ## ...
- Java+Tomcat 环境部署
Java+Tomcat 环境部署 下面在Centos7进行安装Java+Tomcat,网上的很多文章,我在部署中都有些问题,下面是我自己总结的一个安装过程! 安装Java环境 首先,我们先到Java官 ...
- c语言 运算器
#include<stdio.h> #include<stdbool.h> void menu(){ printf("************************ ...
- 在Yii2中集成Markdown编辑器
安装命令: composer require ijackua/yii2-lepture-markdown-editor-widget:dev-master 可能会遇到的问题 如果在下载依赖包的过程中出 ...
- 数据库设计_ERMaster安装使用_PowerDesigner数据设计工具
数据库设计 1. 说在前面 项目开发的流程包括哪些环节 需求调研[需求调研报告]-- 公司决策层 (1) 根据市场公司需求分析公司是否需要开发软件来辅助日常工作 (2) 公司高层市场考察,市场分析,决 ...
- PHP传引用赋值底层的变化
$a = 3;$b = &$a;//传引用,即地址赋值 使用xdebug_debug_zval('a');使用xdebug_debug_zval('b');运行结果为:a:(refcount= ...
- vue+element下拉树选择器
项目需求:输入框点击弹出树形下拉结构,可多选或者单选. 解决方案:1.使用layui formSelect多选插件 2.基于vue+elementui 下拉框和树形控件组合成树形下拉结构 <el ...