目录
1. 一些基本概念
1.1 Nginx初步认识
1.2 正向/反向代理
1.3 域名和IP
2. Nginx 安装和配置
2.1 安装
2.2 配置
3. Nginx的使用
3.1 部署静态网页
3.2 反向代理和负载均衡
课外知识导读
1. URL和URI
2. DNS解析过程
复习
1. 一些基本概念
1.1 Nginx初步认识
-  
Nginx介绍
-  
engine x
 -  
俄罗斯
 -  
开源的框架
 -  
c语言
 -  
Tengine - 淘宝基于nginx修改的
 
 -  
 -  
Nginx能干什么?
-  
作为web服务器
-  
解析http协议
 
 -  
 -  
反向代理服务器
-  
了解反向代理的概念
 
 -  
 -  
邮件服务器
-  
解析邮件相关的协议: pop3/smtp/imap
 
 -  
 
 -  
 -  
Nginx的优势?
-  
更快
-  
高峰期(数以万计的并发时)nginx可以比其它web服务器更快的响应请求
 
 -  
 -  
高扩展
-  
低耦合设计的模块组成,丰富的第三方模块支持
 -  
高内聚带来的依赖程度就越来越高,理想是要实现高内聚,低耦合。
 -  
低耦合就是几个类之间没有关系
 
 -  
 -  
高可靠
-  
经过大批网站检验
-  
www.sina.com.cn
 -  
www.xunlei.com
 -  
www.163.com
 
 -  
 -  
每个worker进程相对独立, 出错之后可以快速开启新的worker
-  
worker进程的个数是可以控制的
 -  
在后台干活的进程
 -  
每个电脑的最多核心数建议是电脑内核的个数,太多也需要时间片进行轮转进行切换。
 
 -  
 
 -  
 -  
低内存消耗
-  
一般情况下,10000个非活跃的HTTP Keep-Alive连接在nginx中仅消耗 2.5M内存(非活跃用户连接不发送数据)
 
 -  
 -  
单机支持10万以上的并发连接
-  
取决于内存,10万远未封顶
 
 -  
 -  
热部署
-  
master和worker的分离设计,可实现7x24小时不间断服务的前提下升级nginx可执行文件
 -  
也就是更新的时候不需要用户暂停使用服务器
 
 -  
 -  
最自由的BSD许可协议
-  
BSD许可协议允许用户免费使用nginx, 修改nginx源码,然后再发布
-  
淘宝: tengine
 
 -  
 
 -  
 
 -  
 
1.2 正向/反向代理
-  
正向代理
正向代理是位于客户端和原始服务器之间的服务器,为了能够从原始服务器获取请求的内容,客户端需要将请求发送给代理服务器,然后再由代理服务器将请求转发给原始服务器,原始服务器接受到代理服务器的请求并处理,然后将处理好的数据转发给代理服务器,之后再由代理服务器转发发给客户端,完成整个请求过程。
==正向代理的典型用途就是为在防火墙内的局域网客户端提供访问Internet的途径==, 比如:
-  
学校的局域网(登录的是代理服务器)
 -  
单位局域网访问外部资源 (屏蔽了一些网站)
 -  
找代理服务器翻过中国的防火墙,这样就可以实现访问外网,也就是vpn
 
 -  
 

正向代理服务器是为用户服务的
-  
反向代理
反向代理方式是指代理原始服务器来接受来自Internet的链接请求,然后将请求转发给内部网络上的原始服务器,并将从原始服务器上得到的结果转发给Internet上请求数据的客户端。那么顾名思义,反向代理就是位于Internet和原始服务器之间的服务器,对于客户端来说就表现为一台服务器,客户端所发送的请求都是直接发送给反向代理服务器,然后由反向代理服务器统一调配。
 




-  
客户端给服务器发送请求, 连接服务器, 用户不知道服务器地址, 只有反向代理服务器的地址是公开的
 -  
请求直接发给反向代理服务器
 -  
反向代理服务器将请求转发给后边的web服务器
-  
web服务器 N 台 做了集群
 -  
反向代理服务器转发请求会轮询进行
 
 -  
 -  
web服务器收到请求进行处理, 得到结果
 -  
web服务器将处理结果发送给反向代理服务器
 -  
反向代理服务器将拿到的结果转发给客户端
 
1.3 域名和IP
-  
什么是域名?
-  
www.baidu.com
 -  
jd.com
 -  
taobao.com(给ip地址取个别名)
 
 -  
 -  
什么是IP地址?
-  
点分十进制的字符串
-  
11.22.34.45
 
 -  
 
 -  
 -  
域名和IP地址的关系?
-  
域名绑定IP
-  
一个域名只能绑定一个IP
 -  
一个IP地址被多个域名绑定
 
 -  
 
 -  
 
2. Nginx 安装和配置
2.1 安装
-  
下载
-  
官方地址: nginx news
 -  
Nginx相关依赖:
-  
OpenSSL: /index.html
-  
密码库
 -  
使用https进行通信的时候使用
 
 -  
 -  
ZLib下载: zlib Home Site
-  
数据压缩
 -  
安装:
-  
./configure
 -  
make
 -  
sudo make install
 
 -  
 
 -  
 -  
PCRE下载: http://www.pcre.org/
-  
解析正则表达式
 -  
安装
-  
./configure
 -  
make
 -  
sudo make install
 
 -  
 
 -  
 
 -  
 
 -  
 -  
安装
-  
nginx的安装
# nginx工作时候需要依赖三个库 --with链接库 # 三个参数=这三个库对应的源码安装目录 # 根据自己的电脑的库安装包的位置进行指定 ./configure --with-openssl=../openssl-1.0.1t --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 make sudo make install    #安装nginx很容易出问题 #如PCREmake时出问题 需要检查是否有gcc g++环境 #法1 yum -y install gcc-g++ #法2 apt-get install gcc apt-get install g++#nginx出问题参考以下文章 https://blog.csdn.net/lijunliang2017/article/details/120400666
Nginx 相关的指令
-  
Nginx的默认安装目录
/usr/local/nginx conf -> 存储配置文件的目录 html -> 默认的存储网站(服务器)静态资源的目录 [图片, html, js, css] logs -> 存储log日志 sbin -> 启动nginx的可执行程序Nginx可执行程序的路径
 -  
/usr/local/nginx/sbin/nginx # 快速启动的方式 默认是不在路径上的 # 1. 将/usr/local/nginx/sbin/添加到环境变量PATH中 # 2. /usr/local/nginx/sbin/nginx创建软连接, 放到PATH对应的路径中, 比如: /usr/bin #echo $PATH 可以看到path路径 ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx  ps aux | grep nginx #查看nginx线程启动Nginx - 需要管理器权限
 
 -  
 
 -  
 
  # 假设软连接已经创建完毕
  sudo nginx # 启动 
-  
关闭Nginx
# 第一种, 马上关闭 sudo nginx -s stop # 第二种, 等nginx作为当前操作之后关闭 sudo nginx -s quit测试是否安装成功
-  
知道nginx对应的主机的IP地址 - > 192.168.1.100
 -  
ifconfig 查看地址
 
 -  
 

-  
  
-  
在浏览器中访问该IP地址
看到一个welcom nginx的欢迎面
 
 -  
 

重新加载Nginx
-  
sudo nginx -s reload # 修改了nginx的配置文件之后, 需要执行该命令2.2 配置
 -  
Nginx配置文件的位置
 
/usr/local/nginx/conf/nginx.conf 
Nginx配置文件的组织格式

-  
http -> 模块, http相关的通信设置
-  
server模块 -> 每个server对应的是一台web服务器
-  
location 模块
-  
处理的是客户端的请求
 
 -  
 
 -  
 
 -  
 -  
mail -> 模块, 处理邮件相关的动作
 
常用配置项介绍
user  nobody; # 启动之后的worker进程属于谁 nobody表示是普通用户
	- 错误提示: nginx操作xxx文件时候失败, 原因: Permission denied  
	- 将nobody -> root
worker_processes  1; # 设置worker进程的个数, 最大 == cpu的核数 (推荐)
error_log  logs/error.log; # 错误日志, /usr/local/nginx
pid        logs/nginx.pid; # pid文件, 里边是nginx的进程ID
# nginx的事件处理
events {
 	use epoll;	# 多路IO转接模型使用epoll
 	worker_connections  1024;	// 每个工作的进程的最大连接数
}
http->server -> 每个server模块可以看做一台web服务器
server{
	listen       80;  # web服务器监听的端口, http协议的默认端口 ftp21 ssh sftp 22 https 443
    server_name  localhost; # 对应一个域名, 客户端通过该域名访问服务器
    charset utf8; 	# 字符串编码
    location {	// 模块, 处理客户端的请求
}
# 客户端 (浏览器), 请求:
  http://192.168.10.100:80/login.html
# 服务器处理客户端的请求
  服务器要处理的指令如何从url中提取?
  - 去掉协议: http
  - 去掉IP/域名+端口: 192.168.10.100:80
  - 最后如果是文件名, 去掉该名字: login.html
  - 剩下的: /
  服务器要处理的location指令: 
  location /
  {
        处理动作
  } 
3. Nginx的使用
3.1 部署静态网页
-  
静态网页存储目录 静态网页是指每个人看到的都是一样的 动态网页是指不同人提交的东西是不同的
 
默认的存储目录:
/usr/local/nginx/html 
自己创建新的目录:
应该在 /usr/local/nginx/
mkdir /usr/local/nginx/mydir 
练习
在Nginx服务器上进行网页部署, 实现如下访问:
在/usr/local/nginx/创建新的目录, yundisk用来存储静态网页
-  
访问地址: http://192.168.80.254/login.html
-  
login.html放到什么位置?
 
 -  
 
/ -> 服务器的资源根目录, /usr/local/nginx/yundisk
login.htm-> 放到yundisk中 
服务器要处理的动作
# 对应这个请求服务器要添加一个location
location 指令(/)
{
    # 找一个静态网页
    root yundisk;  # 相对于/usr/local/nginx/来找
    # 客户端的请求是一个目录, nginx需要找一默认显示的网页 默认先找第一个 找不到就第二个
    index index.html index.htm;
}
# 配置之后重启nginx
sudo nginx -s reload 

配置文件如下;
#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       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
		
       #http://192.168.254.128/login.html
       #  拆分之后 / yundisk 表示去寻找的根目录
        location / {
            root   yundisk;
        }
		
		#http://192.168.80.254/hello/reg.html
	 	#  拆分之后 /hello/ yundisk 表示去寻找的根目录
		location /hello/
        {
            root yundisk;
            index xx.html;
        }
		#http://192.168.80.254/upload/
		#解析 /upload/ 会访问配置的index 的upload.html
		location /upload/
        {
           root   yundisk;
           index  upload.html;
        }
		
        #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;
    #    }
    #}
}
 
访问地址: http://192.168.80.254/hello/reg.html
-  
hello是什么?
-  
目录
 
 -  
 -  
reg.html放到哪儿?
-  
hello目录中
 
 -  
 -  
如何添加location
 
#理论上是需要加以下路径的 但是我测试的时候不需要加也是可以的 说明可以将其进行解析
location /hello/
{
    root yundisk;
    index xx.html;
} 
访问地址: http://192.168.80.254/upload/ 浏览器显示upload.html
-  
直接访问一个目录, 得到一默认网页
-  
upload是一个目录, uplaod.html应该再upload目录中
 
 -  
 
location /upload/
{
    root yundisk;
    index upload.html;
} 
3.2 反向代理和负载均衡
反向代理和负载均衡是两码事儿

准备工作:
需要客户端 - 1个
Window中的浏览器作为客户端
反向代理服务器 -> 1个
window作为反向代理服务器
web服务器 -> 2个
ubuntu - liu: 192.168.247.135
ubuntu - luffy : 192.168.26.250
-  
反向代理设置
 

找window上对应的nginx的配置文件
	- conf/nginx.conf
# 代理几台服务器就需要几个server模块
    # 客户端访问的url: http://192.168.1.100/login.html
    server {
        listen       80;        # 客户端访问反向代理服务器, 代理服务器监听的端口
        server_name  ubuntu.com; # 客户端访问反向代理服务器, 需要一个域名
        location / {
            # 反向代理服务器转发指令, http:// 固定 robin.test.com转发的名称 在下面进行配置
            proxy_pass http://robin.test.com;
        }
    }
    # 添加一个代理模块
    upstream robin.test.com
    {
        server 192.168.247.135:80;
    }
    # luffy
    server {
        listen       80;        # 客户端访问反向代理服务器, 代理服务器监听的端口
        server_name  hello.com; # 客户端访问反向代理服务器, 需要一个域名
        location / {
            # 反向代理服务器转发指令, http:// 固定
            proxy_pass http://luffy.test.com;
        }
    }
    # 添加一个代理模块
    upstream luffy.test.com
    {
        server 192.168.26.250:80;//80代表http的端口号
    }
}
#需要在C:\Windows\System32\drivers\etc\hosts 添加以下
# test
127.0.0.1 centos7.com
127.0.0.1 robin.com
127.0.0.1 hello.com
#那么首先访问robin.com会将其解析为127.0.0.1
#如果本地没有的话 那么就会从本地访问过的dns解析
#测试代理就是输入不同的域名 看是否可以解析到不同的虚拟机ip地址上 
负载均衡设置

#实现负载均衡 需要保证域名是一样的   localhost
#负载均衡是在反向代理的基础上进行的
server {
        listen       80;         # 客户端访问反向代理服务器, 代理服务器监听的端口
        server_name  localhost; # 客户端访问反向代理服务器, 需要一个域名
        location / {
            # 反向代理服务器转发指令, http:// 固定的头
            proxy_pass http://linux.com;
        }
        location /hello/ {
            # 反向代理服务器转发指令, http:// 固定的头
            proxy_pass http://linux.com;
        }
    	location /upload/ {
            # 反向代理服务器转发指令, http:// 固定的头
            proxy_pass http://linux.com;
        }
    }
	# 不写权重的话会自动进行轮询
	# weight表示权重 权重越大处理的越多
    # 添加一个代理模块
    upstream linux.com
    {
        server 192.168.247.135:80 weight=1;
        server 192.168.26.250:80 weight=3;
    }
# 上面是代理服务器做的事情 也就是会将 /hello/ /upload/等转发给配置好的web服务器
## =====================================
web服务器需要做什么?
# 192.168.247.135
location /
{
    root xxx;
    index xxx;
}
location /hello/ 
{
    root xx;
    index xxx;
}
location /upload/ 
{
    root xxx;
    index xx;
}
# 192.168.26.250
location /
{
    root xxx;
    index xxx;
}
location /hello/ 
{
    root xx;
    index xxx;
}
location /upload/ 
{
    root xxx;
    index xx;
} 
课外知识导读
1. URL和URI

概念:
- URL(Uniform Resource  Locator): 统一资源定位符
- 表示资源位置的字符串
  - 基本格式: "==协议://IP地址/路径和文件名=="
    - <ftp://ftp.is.co.za/rfc/rfc1808.txt>
    - <http://www.ietf.org/rfc/rfc2396.txt>
    - <telnet://192.0.2.16:80/>
- URN(Uniform Resource  Name): 统一资源名称
  - P2P下载中使用的磁力链接
- URI(Uniform Resource  Identifier): 统一资源标识符
  - 是一个紧凑的字符串用来标示抽象或物理资源, ==**URL是URI的一种**== 
  - 让URI能成为URL的当然就是那个“访问机制”,“网络位置”。e.g. `http://` or `ftp://`。
    - files.hp.com 
    - <tel:+1-816-555-1212>
    - <ftp://ftp.is.co.za/rfc/rfc1808.txt>               (also a URL)
    - <http://www.ietf.org/rfc/rfc2396.txt>         (also a URL)
    - <telnet://192.0.2.16:80/>                              (also a URL)
- 有协议的uri可以称作url,url不一定是uri,url都是uri 
经验式理解:

-  
从包含关系上说: URI包含URL
字符串长度上说: URL包含URI
UIRI可以没有协议, 没有地址(IP/域名)
 
| URL | 红色字体部分+绿色字体部分 | 
|---|---|
| URI | 绿色字体部分 | 
2. DNS解析过程
 
-  
DNS解析的过程
-  
在浏览器中输入www.magedu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
 -  
如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
-  
Windows和Linux系统都会在本地缓存dns解析的记录,提高速度。
 
 -  
 -  
如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找
TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。 -  
如果要查询的域名,不由本地DNS服务器区域解析,但该DNS服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
 -  
如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(没有设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责 .com域的这台服务器。这台负责 .com域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com域的下一级DNS服务器地址(magedu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找magedu.com域服务器,重复上面的动作进行查询,直至找到www.magedu.com主机。
 -  
如果用的是转发模式(设置转发器),此DNS服务器就会把请求转发至上一级ISP DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
 
 -  
 -  
域名解析服务器
-  
Pod DNS+:
-  
首选:119.29.29.29
 -  
备选:182.254.116.116
 
 -  
 -  
114DNS:
-  
首选:114.114.114.114
 -  
备选:114.114.114.115
 
 -  
 -  
阿里 AliDNS:
-  
首选:223.5.5.5
 -  
备选:223.6.6.6
 
 -  
 
 -  
 -  
hosts文件
# 存储的是域名和IP的对应关系 -windows目录: "C:\Windows\System32\drivers\etc\hosts"
复习
 
redis
-  
是什么?
-  
非关系型数据库 - nosql
-  
数据存储在内存里边
 
 -  
 
 -  
 -  
能干什么?
-  
提高程序效率
 -  
程序中频繁访问的数据, 可以存储到redis中
 
 -  
 -  
我们需要干什么?
-  
会安装
 -  
掌握启动redis服务器和客户端的启动命令
# 服务器 redis-server (配置文件名) # 客户端 redis-cli (-h redis服务器IP -p 端口)
 -  
redis中支持的数据类型 - value
-  
键值对方式存储数据
-  
key - 字符串
 -  
value
-  
字符串 - string
 -  
列表 - list
 -  
集合 - set
 -  
排序集合 - sortedSet
 -  
哈希 - hash
 
 -  
 
 -  
 -  
关于服务器使用的配置文件的修改
 -  
redis中持久化
-  
rdb
 -  
aof
 
 -  
 
 -  
 
 -  
 -  
能够在程序中操作redis服务器
-  
需要使用以下函数接口
 -  
官方地址 - > 客户端 -> 选择语言
 
 -  
 



















