文档章节

Nginx 配置从零开始

Yomut
 Yomut
发布于 2016/09/30 13:40
字数 1839
阅读 7
收藏 2
点赞 0
评论 0

作为一个 nginx 的初学者记录一下从零起步的点滴。

基本概念

Nginx 最常的用途是提供反向代理服务,那么什么反向代理呢?正向代理相信很多大陆同胞都在这片神奇的土地上用过了,原理大致如下图:

Nginx 配置从零开始

代理服务器作为客户端这边的中介接受请求,隐藏掉真实的客户,向服务器获取资源。如果代理服务器在长城外的话还能顺便帮助我们实现翻越长城的目的。而反向代理顾名思义就是反过来代理服务器作为服务器的中介,隐藏掉真实提供服务的服务器,原理大致如下图:

Nginx 配置从零开始

这么做当然不是为了实现翻越长城,而是为了实现安全和负载均衡等一系列的功能。所谓安全指客户端的请求不会直接落到内网的服务器上而是通过代理做了 一层转发,在这一层就可以实现安全过滤,流控,防 DDOS 等一系列策略。而负载均衡指我们可以水平扩展后端真正提供服务的服务器数量,代理按规则转发请求到各个服务器,使得各个服务器的负载接近均衡。

而 nginx 就是目前流行的这样一个反向代理服务。

安装

在 Ubuntu 下,可以舍去编译安装的过程,直接 apt-get

sudo apt-get install nginx

安装好之后可以直接通过:

sudo service nginx start

来启动 nginx 服务,nginx 默认设置了 80 端口的转发,我们可以再浏览器访问 http://locallhost 来进行检查。

初始配置

nginx 的默认配置文件位于

/etc/nginx/nginx.conf

学习配置最好的方式,就是从例子入手,我们先不看其他的配置,直接看和 nginx 默认页面相关的配置。在配置文件中有一行:

include /etc/nginx/sites-enabled/*;

这一行加载了一个外部的配置文件,sites-enabled 文件夹下只有一个 default 文件,这个外部的配置文件就是负责我们 nginx 的默认代理。将配置的内容缩水后,得到下面几行:

server {
    server_name localhost;
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    location / {
    try_files $uri $uri/ =404;
    }
}

一个大型的网站通常会有很多下属的站点,有各自的服务器提供相应的服务,在 nginx 中我们可以通过一个叫虚拟主机的概念来将这些不同的服务配置隔离,这就是上面配置中的 server 的含义。举例来说 google 旗下有翻译和学术两款产品我们就可以在 nginx 的配置文件中配置两个 server,servername 分别为 translate.google.com 和 scholar.google.com,这样的话不同的 url 请求就会对应到 nginx 相应的设置,转发到不同的后端服务器上。这里的 servername 是和客户端 http 请求中的 host 行进行匹配的。

本例中 server_name 为 localhost,这就是为什么我们可以在浏览器通过 localhost 访问到页面的配置。下面两个 listen 分别对应了 ipv4 和 ipv6 下的监听端口如果设为 8080,那么我们就只能通过 localhost:8080 来访问到默认页面了。

default_server 的含义是指如果有其他 http 请求的 host 在 nginx 中不存在设置的话那么就用这个 server 的配置来处理。比如我们去访问 127.0.0.1 那么也会落到这个 server 来处理。

每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。

在这里 location 匹配 / 开始的所有请求,即 localhost 下的 /xxx 或者 /yyy 都要走下面的配置,除了这种简单粗暴的匹配,nginx 也支持正则和完全相等及其他的精细匹配方式。而 tryfiles 意思是 nginx 会按照接下来的顺序去访问文件,将第一个匹配的返回。比如你去请求 localhost/test,他会去寻找 /test 文件,找不到再去找 /test/ 再找不到就返回一个 404。此外我们还可以在 location 的配置里用 proxypass 实现反向代理和负载均衡,不过这个最简单的配置并没有涉及。

其中 root 是指将本地的一个文件夹作为所有 url 请求的根路径。比如用户请求了一个 localhost/test,那么 nginx 就会去需找 /usr/share/nginx/html 文件夹下的 test 文件返回。

而 index 就是默认的访问页面了,当我们访问 localhost 时,他会自动按顺序寻找 root 文件路径下的 index.html 和 index.htm 将第一个找到的结果返回。

location 进阶配置

上面的配置只是将用户的 url 映射到本地的文件,并没有实现传说中的反向代理和负载均衡(当然 nginx 做静态文件的分发也是想到的厉害),下面我们就来进一步配置 location 看看怎么实现。

配置起来很简单比如我要将所有的请求到转移到真正提供服务的一台机器的 8080 端口,只要这样:

location / {
    proxy_pass 123.34.56.67:8080;
}

这样所有的请求就都被反向代理到 123.34.56.67 去了。这样我们反向代理的功能是实现了,可是就能代理到一台服务器上哪有什么负载均衡呀?这就要用到 nginx 的 upstream 模块了。

upstream backend {
    ip_hash;    
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    server backend4.example.com;
}
location / {
    proxy_pass http://backend;
}

我们在 upstream 中指定了一组机器,并将这个组命名为 backend,这样在 proxypass 中只要将请求转移到 backend 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。其中的 iphash 指明了我们均衡的方式是按照用户的 ip 地址进行分配。

要让配置生效,我们不必重启 nginx 只需要 reload 配置即可。

sudo service nginx reload

总结

以上是最简单的通过 nginx 实现静态文件转发、反向代理和负载均衡的配置。在 nginx 中所有的功能都是通过模块来实现的,比如当我们配置 upstream 时是对 upstream 模块,而 server 和 location 是在 http core 模块,其他的还有流控的 limt 模块,邮件的 mail 模块,https 的 ssl 模块。他们的配置都是类似的可以再 nginx 的模块文档中找到详细的配置说明。

欢迎大家在讨论区有血性的争论、动手、拍砖、捅刀子,亮出你的看法来!本博客已经全文RSS输出,大家可以通过订阅oilbeater.com/atom.html即可获得博客更新。或者关注我的微博@oilbeater在上面我会通知我的博客更新并且还会分享一些有意思的技术文章,欢迎大家关注。

来自:http://geek.csdn.net/news/detail/22208

© 著作权归作者所有

共有 人打赏支持
Yomut
粉丝 15
博文 178
码字总数 162078
作品 0
厦门
后端工程师
从零开始搭建Kubernetes集群(五、搭建K8S Ingress)

一、前言 上一文《从零开始搭建Kubernetes集群(四、搭建K8S Dashboard)》介绍了如何搭建Dashboard。本篇将介绍如何搭建Ingress来访问K8S集群的Service。 二、Ingress简介 Ingress是个什么鬼...

宅楠军 ⋅ 05/14 ⋅ 0

nginx负载均衡以及静态资源的反向代理实施方案

nginx负载均衡以及静态资源的反向代理实施方案 作者:袁旭云 nginx介绍 nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个B...

IT小香猪 ⋅ 2016/09/01 ⋅ 1

ZF2入门:Ubuntu/Linux环境下从零开始Zend Framework 2.0 (ZF...

紧接上一篇ZF2入门:Windows环境下从零开始Zend Framework 2.0 (ZF2)环境搭建,本次是Linux/Ubuntu环境下从零开始搭建系统并运行一个ZF2项目的全过程。 写日志的Linux用的是Ubuntu12.04 LTS...

AlloVince ⋅ 2012/10/22 ⋅ 0

web应用中配置文件

NGINX配置文件 nginx.conf 1、nginx.conf结构分析 nginx配置文件中主要包括六块:main,events,http,server,location,upstream main 块:(全局设置)主要控制 nginx子进程的所属用户/用...

SibylY ⋅ 2016/06/01 ⋅ 0

从零开始创建一个ghost博客

教你从零开始如何从一个VPS上搭建起来属于自己的一个Ghost小而美的博客。 这是我的GHOST博客地址 先选购一家VPS服务提供商。 这里我购买的是国外的VPS服务提供商,主要还是便宜,还有某些不可...

爪爪熊 ⋅ 2017/12/14 ⋅ 0

从零开始完整搭建LNMP环境+WordPress部署

0.说明 内容会有点多,但是下面的内容都是自己在学习LNMP环境搭建过程中的完整再现,所以非常具有参考价值! 下面用一个以最小化方式(Minimal)安装的CentOS 6.5操作系统为例,演示LNMP环境...

xpleaf ⋅ 2017/03/03 ⋅ 0

ngx_lua_API 指令详解(一)ngx.timer.at 指令

语法: ok,err = ngx.timer.at(delay,callback,userarg1,userarg2 ...) 上下文: initworkerbylua *,setbylua *,rewritebylua *,accessbylua *,contentbylua *,headerfilterbylua......

tinywan1227 ⋅ 2017/05/04 ⋅ 0

Docker 中启动 Nginx 实现HTTPS访问并进行反向代理Tomcat

成功经验总结,正确配置五步搞定 一、安装Nginx 二、Nginx 阿里 HTTPS配置 三、制作Nginx镜像 nginx.conf 文件如下: Dockerfile 文件如下: 注意事项 四、制作docker-compose docker-compo...

1825923331568368 ⋅ 06/12 ⋅ 0

用Redis存储Tomcat集群的Session

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机、对使用用户零影响...

凯文加内特 ⋅ 2016/01/04 ⋅ 2

树莓派搭建记录(1)--系统安装

组装 树莓派相对来说比较简单,几个螺丝,一块板子+散热片,外壳,还有风扇(长时间开机确实需要不然发热还是挺高的) 贴散热片 一大一小两个散热片贴好便是 风扇安装,注意针脚的位置 系统安...

桀骜不驯的喵 ⋅ 2017/08/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

懒惰根本就不存在

简评:芝加哥大学心理学教授,懒惰根本就不存在。(本文表面讲行为心理学实则讲教育) 金句:以好奇而不是判断来回应一个人的无效行为,是非常有帮助的。 本文「我」代表原作者 E Price。 自...

极光推送 ⋅ 10分钟前 ⋅ 0

Excel提取单元格中最后一个“.”后面的数据

java.lang.String ----- String =TRIM((MID(SUBSTITUTE(B2,".",REPT(" ",99)),(LEN(B2)-LEN(SUBSTITUTE(B2,".","")))*99,99)))...

klog ⋅ 12分钟前 ⋅ 0

mac远程桌面

下载安装remote-desktop-mac Mac beta 客户端 mac通过远程桌面访问windows服务器。

亚林瓜子 ⋅ 16分钟前 ⋅ 0

firrtl

动手---sbt(2)之后,再回头看 chisel第一个实验,根据 https://github.com/freechipsproject/firrtl 发现firrtl没有执行sbt assembly命令,重新执行这个命令,结果成功。如下图: joe@joe-As...

whoisliang ⋅ 20分钟前 ⋅ 0

NIO

一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 二、通道的主要实现类 java.nio.channel...

stars永恒 ⋅ 21分钟前 ⋅ 0

Android悬浮窗的实现

0. 前言   现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以...

猴亮屏 ⋅ 21分钟前 ⋅ 0

日志采集中的关键技术分析

概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此...

tqyin ⋅ 22分钟前 ⋅ 0

使用Navicat将数据导出为text文本 然后再导入

将数据导出为text文本效率很高 1. 准备工作 1.1 准备表结构 1.2 目标库 执行生成表结构sql 2.将表数据导出为text文本 生成的text文本 3. 目标库 导入text 4.效果...

Lucky_Me ⋅ 28分钟前 ⋅ 0

IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

文章介绍了idea下,项目乱码、控制台乱码及运行tomcat控制台乱码的解决方案,文章链接:https://www.cnblogs.com/vhua/p/idea_1.html

Funcy1122 ⋅ 31分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 36分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部