目录
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服务器
-
需要使用以下函数接口
-
官方地址 - > 客户端 -> 选择语言
-