Nginx快速上手
OVERVIEW
- Nginx快速上手
- 一、基本概念
- 1.Nginx初步认识
- 2.正向/反向代理
- (1)正向代理
- (2)反向代理
- 二、Nginx 安装和配置
- 1.安装
- 2.Nginx指令
- 3.Nginx配置
- 三、Nginx的使用
- 1.Web服务器
- (1)静态网页存储目录
- (2)Nginx静态网页设置
- 2.反向代理和负载均衡
- (1)反向代理设置
- (2)负载均衡设置
- 3.总结
- 四、相关内容补充
- 1.URL和URI
- 2.DNS解析过程
一、基本概念
1.Nginx初步认识
Nginx能干什么?
- 作为web服务器:解析http协议
- 反向代理服务器:了解反向代理的概念
- 邮件服务器:解析邮件相关的协议: pop3/smtp/imap
Nginx的优势?
- 更快:高峰期(数以万计的并发时)nginx可以比其它web服务器更快的响应请求
- 高扩展:低耦合设计的模块组成,丰富的第三方模块支持
- 高可靠:经过大批网站检验,新浪、迅雷、
- 每个worker进程相对独立, 出错之后可以快速开启新的worker
- worker进程的个数是可以控制的
- 在后台干活的进程
- 低内存消耗:一般情况下,10000个非活跃的HTTP,Keep-Alive连接在nginx中仅消耗 2.5M内存
- 单机支持10万以上的并发连接:取决于内存,10万远未封顶
- 热部署:master和worker的分离设计,可实现7x24小时不间断服务的前提下升级nginx可执行文件
- 最自由的BSD许可协议:BSD许可协议允许用户免费使用nginx, 修改nginx源码,然后再发布(淘宝: tengine)
2.正向/反向代理
(1)正向代理
正向代理是位于客户端和原始服务器之间的服务器,为了能够从原始服务器获取请求的内容,客户端需要将请求发送给代理服务器,然后再由代理服务器将请求转发给原始服务器,原始服务器接受到代理服务器的请求并处理,然后将处理好的数据转发给代理服务器,之后再由代理服务器转发发给客户端,完成整个请求过程。
正向代理服务器是为用户服务的,正向代理的典型用途就是为在防火墙内的局域网客户端提供访问Internet的途径, 比如:
- 学校的局域网
- 单位局域网访问外部资源
(2)反向代理
反向代理方式是指代理原始服务器来接受来自Internet的链接请求,然后将请求转发给内部网络上的原始服务器,并将从原始服务器上得到的结果转发给Internet上请求数据的客户端。那么顾名思义,反向代理就是位于Internet和原始服务器之间的服务器,对于客户端来说就表现为一台服务器,客户端所发送的请求都是直接发送给反向代理服务器,然后由反向代理服务器统一调配。
- 客户端给服务器发送请求, 连接服务器, 用户不知道服务器地址, 只有反向代理服务器的地址是公开的
- 请求直接发给反向代理服务器
- 反向代理服务器将请求转发给后边的web服务器
- web服务器 N 台
- 反向代理服务器转发请求会轮询进行
- web服务器收到请求进行处理, 得到结果
- web服务器将处理结果发送给反向代理服务器
- 反向代理服务器将拿到的结果转发给客户端
二、Nginx 安装和配置
1.安装
Nginx相关依赖安装:
- OpenSSL密码库(使用https进行通信的时候使用): http://www.openssl.org/
- ./configure
- make
- sudo make install
- ZLib数据压缩下载: http://www.zlib.net/
- ./configure
- make
- sudo make install
- PCRE解析正则表达式下载: http://www.pcre.org/
- ./configure
- make
- sudo make install
Nginx安装:
# nginx工作时候需要依赖三个库
# 三个参数=这三个库对应的源码安装目录
# 具体目录需要根据自己的电脑的库安装包的位置进行指定
./configure --with-openssl=../openssl-1.0.1t --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11
make
sudo make install
2.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 ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
-
启动Nginx - 需要管理器权限
# 假设软连接已经创建完毕 sudo nginx # 启动 # 查看nginx运行状态 ps -ef | grep nginx
-
关闭Nginx
# 第一种, 马上关闭 sudo nginx -s stop # 第二种, 等nginx做完本次操作之后关闭 sudo nginx -s quit
-
重新加载Nginx
sudo nginx -s reload # 修改了nginx的配置文件之后, 需要执行该命令
-
测试是否安装成功
- 知道nginx对应的主机的IP地址 - > 192.168.1.100
- 在浏览器中访问该IP地址看到一个welcom nginx的欢迎界面
3.Nginx配置
-
Nginx配置文件的位置
/usr/local/nginx/conf/nginx.conf
-
Nginx配置文件的组织格式
- http -> 模块, http相关的通信设置
- server模块 -> 每个server对应的是一台web服务器
- location 模块:处理的是客户端的请求
- server模块 -> 每个server对应的是一台web服务器
- mail -> 模块, 处理邮件相关的动作
- http -> 模块, http相关的通信设置
-
常用配置项介绍
user nobody; # 启动之后的worker进程属于谁
- 错误提示: 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协议的默认端口,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 /
{
处理动作
}
三、Nginx的使用
1.Web服务器
(1)静态网页存储目录
-
默认的存储目录:
/usr/local/nginx/html
-
自己创建新的目录:
应该在 /usr/local/nginx/ mkdir /usr/local/nginx/mydir
(2)Nginx静态网页设置
在Nginx服务器上进行网页部署, 实现如下访问:在/usr/local/nginx/创建新的目录, 用来存储静态网页,
几个问题:
-
客户端发起访问地址(访问静态网页): 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.html # index index.html index.htm; } # 配置之后重启nginx sudo nginx -s reload
-
访问地址(访问静态网页): 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; }
2.反向代理和负载均衡
-
需要客户端 - 1个:Window中的浏览器作为客户端
-
反向代理服务器 -> 1个:作为反向代理服务器
-
web服务器 -> 2个
-
ubuntu - server1: 192.168.247.135
-
ubuntu - server2 : 192.168.26.250
-
(1)反向代理设置
修改nginx的配置文件 - conf/nginx.conf
# 代理几台服务器就需要几个server模块
# 将 domain_name1 与 domain_name2设置为映射到同一个ip地址
# 客户端访问的url: http://192.168.1.100/login.html
# server1
server {
listen 80; # 客户端访问反向代理服务器, 代理服务器监听的端口
server_name domain_name1; # 客户端访问反向代理服务器, 需要一个域名
location / {
# 反向代理服务器转发指令, http:// 固定
proxy_pass http://server1.test.com;
}
}
# 添加一个代理模块
upstream server1.test.com
{
server 192.168.247.135:80;
}
# server2
server {
listen 80; # 客户端访问反向代理服务器, 代理服务器监听的端口
server_name domain_name2; # 客户端访问反向代理服务器, 需要一个域名
location / {
# 反向代理服务器转发指令, http:// 固定
proxy_pass http://server2.test.com;
}
}
# 添加一个代理模块
upstream server2.test.com
{
server 192.168.26.250:80;
}
}
(2)负载均衡设置
反向代理服务器需要做什么?
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;
}
}
# 添加一个代理模块
upstream linux.com
{
server 192.168.247.135:80 weight=1;
server 192.168.26.250:80 weight=3;
}
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;
}
3.总结
- Nginx作为web服务器:
# 部署静态网页
1. 制作出来, 并且部署到对应的资源目录中
2. 根据客户端的请求, 在服务器端添加对应的 location处理指令 - nginx.conf
3. 重新加载nginx.conf配置文件
客户端请求的url: http://xxxx.com/hello/login.html
- 去掉协议: http
- 去掉域名/IP:
- 去掉端口
- 去掉尾部的文件名
- Nginx作为反向代理服务器:
1. 找到反向代理服务器 的配置文件: nginx.conf
2. 找模块 http -> server
server{
listen: 80; # 客户端访问反向代理服务器的时候使用的端口
server_name: localhost; # 域名, 客户端访问反向代理服务器时候, 使用的地址
# 配置如何转发, 根据客户端的请求的url找到对应的转发指令
location /
{
# 设置转发地址
proxy_pass http://test.com;
}
location /login
{
# 设置转发地址
proxy_pass http://test.com;
}
}
# 设置代理
upstream test.com
{
# web服务器的地址信息
server 192.168.1.100:80;
server 192.168.1.101:80;
}
# 192.168.1.100 web服务器
http->server
server{
location /
{
# 设置转发地址
root xxx;
}
location /login
{
# 设置转发地址
xxxx;
}
}
# 192.168.1.101 web服务器
http->server
server{
location /
{
# 设置转发地址
root xxx;
}
location /login
{
# 设置转发地址
xxxx;
}
}
四、相关内容补充
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://
orftp://
。- 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)
-
经验式理解:
http://localhost:8080/myweb/hello.html
从包含关系上说: URI包含URL
字符串长度上说: URL包含URI
UIRI可以没有协议, 没有地址(IP/域名)
2.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服务器再返回给客户机。