实习入职第一天的时候,在同事的帮助下安装了N多软件和工具。然鹅作为一个初入工作的菜鸡,很多工具之前没有接触过,所以后面进行项目相关配置时都是直接copy的组内前辈的配置文件,但是对这些工具的作用和一些配置文件的意义很迷茫。这些天对这些工具进行了一些简单的学习和了解,下面是整理的一些Nginx相关的基础内容。在此做一个记录,如有不对的地方请多多指教。
一、代理介绍
正向代理:举个例子,我目前无法直接访问到Youtube,但是我能访问一个代理服务器,而这个代理服务器可以访问Youtube,于是我先连上代理服务器,告诉他我需要获取Youtube的内容,代理服务器去取回来,然后返回给我。正向代理就是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理:再举个例子,我们跟移动客服联系时,只需要拨通了10086 的总机号码,电话那头则会转接客服为我们服务,但我们并不知道真正提供服务的人是谁。反向代理隐藏了真实的服务端,当我们访问一个网站时,背后可能有成千上万台服务器为我们服务,但具体是哪一台我们并不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,之后反向代理服务器会帮我们把请求转发到提供真实计算的服务器那里去。
二、Nginx功能说明
1、静态HTTP服务器
Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
配置示例:
server {
listen80; # 端口号
location / {
root D:\frontproject\views; # 静态文件路径
}
}
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。
配置示例:
server {
listen 80;
server_name localhost;
location / {
root D:\frontproject;
index index.html;
}
# 所有静态请求都由nginx处理
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root D:\frontproject;
}
# 所有动态请求都转发给tomcat处理
location ~ \.do$ {
proxy_pass http://localhost:8080;
}
}
2、反向代理服务器
客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
配置示例:
server{
listen 80;
location / {
proxy_pass http://127.0.0.1:8080; # 应用服务器HTTP地址
}
}
3、负载均衡
当网站访问量非常大,将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
Nginx可以通过反向代理来实现负载均衡,并能使用3种自带策略及2种第三方策略。
(1)RR(默认,每个请求按时间顺序逐一分配到不同的后端服务器)
upstream mypro {
server 192.168.20.1:8080; # 应用服务器1
server 192.168.20.2:8080; # 应用服务器2
}
server {
listen 80;
location / {
proxy_pass http://mypro ;
}
}
(2)权重(指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况)
upstream mypro {
server 192.168.20.1:8080 weight=3; # 该服务器处理3/4请求
server 192.168.20.2:8080; # weight默认为1,该服务器处理1/4请求
}
server {
... ...
}
(3)ip-hash(以上配置会将请求轮询分配到应用服务器,也就是一个客户端的多次请求,有可能会由多台不同的服务器处理(若存在登录session时则需要重复登录)。ip-hash根据客户端ip地址的hash值将请求分配给固定的某一个服务器处理)
upstream mypro {
ip_hash; # 根据客户端IP地址Hash值将请求分配给固定的一个服务器处理
server 192.168.20.1:8080;
server 192.168.20.2:8080;
}
server {
... ...
}
(4)fair(第三方 按后端服务器的响应时间来分配请求,响应时间短的优先分配)
upstream mypro {
fair;
server localhost:8080;
server localhost:8081;
}
(5)url_hash(第三方 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法)
upstream mypro {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
4、虚拟主机
有的网站访问量大,需要负载均衡。有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
例如将www.a.com和www.b.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
server {
listen 80 default_server;
server_name _;
return 444; # 过滤其他域名的请求,返回444状态码
}
server {
listen 80;
server_name www.a.com; # www.a.com域名
location / {
proxy_pass http://localhost:8080; # 对应端口号8080
}
}
server {
listen 80;
server_name www.b.com; # www.b.com域名
location / {
proxy_pass http://localhost:8081; # 对应端口号8081
}
}
在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。
虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。
三、配置说明
Nginx的基本配置在nginx.conf文件中。(结合组内配置文件,发现分别建立了sites.conf和upstream.conf文件,再include到nginx.conf中来动态解耦地完成配置)
events{ # nginx工作模式配置
worker_connections 1024; #指定最大可以同时接收的连接数量和worker processes共同决定
multi_accept on; # nginx在收到一个新连接通知后尽可能多的接受更多的连接
use epoll; # 配置指定了线程轮询的方法
}
http { # http设置
....
server { #服务器访问信息的配置,一个http中可以配置多个server
listen 80; #监听端口
server_name xxx.net; #指定ip地址或者代理域名
root #整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
index index.html #用户访问web网站时的全局首页
charset #用于设置www/路径中配置的网页的默认编码格式
access_log #用于指定该虚拟主机服务器中的访问记录日志存放路径
error_log #用于指定该虚拟主机服务器中访问错误日志的存放路径
location / { #访问路由的配置
proxy_pass http://namexx; #代理转发域名
root #用于指定访问根目录时,访问虚拟主机的web目录
index #在不指定访问具体资源时,默认展示的资源文件列表
}
upstream namexx { # 代理域名与ip的映射配置 和 负载均衡配置
server 192.168.20.1:8080; # 应用服务器1
server 192.168.20.2:8080; # 应用服务器2
}
}
四、Nginx常用命令及location语法
1、nginx常用命令
nginx -s quit 停止ngix
nginx -s reload 重新载入nginx(当配置信息发生修改时)
nginx -s reopen 打开日志文件
nginx -v 查看版本
nginx -t 查看nginx的配置文件的目录
nginx -h 查看帮助信息
2、基本语法:location [=|~|~*|^~] /uri/ { … }
= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
~ :为区分大小写匹配(可用正则表达式)
!~:为区分大小写不匹配
~*:为不区分大小写匹配(可用正则表达式)
!~*:为不区分大小写不匹配
^~:如果把这个前缀用于一个常规字符串,告诉nginx 如果路径匹配那么不测试正则表达式。
^: 以什么开头的匹配
$: 以什么结尾的匹配
示例:
(1)location = / { # 只匹配 / 查询。}
(2)location / {
# 匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
}
(3)location ^~ /images/ {
# 匹配任何以 /images/ 开头的查询并且停止搜索。任何正则表达式将不会被测试。
}
(4)location ~*.(gif|jpg|jpeg)$ {
# 匹配任何以 gif、jpg 或 jpeg 结尾的请求。
}
网友评论