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.xml即可获得博客更新。或者关注我的微博@oilbeater在上面我会通知我的博客更新并且还会分享一些有意思的技术文章,欢迎大家关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MySQL]经常无故崩溃amd.dll , boot1.exe病毒

近段时间有大量客户反馈,mysql经常无故崩溃或者是在C盘根目录出现 amd.dll , boot1.exe文件此病毒为mysql数据库的漏洞所导致,目前所有版本均有此问题目前已经有大量的客户出现这个问题请收到此消息后立刻检查自己的C盘目录,是否有amd.dll , …

Spring启动和缓存抽象

缓存是大多数应用程序的主要组成部分,只要我们设法避免磁盘访问,缓存就会保持强劲。 Spring对各种配置的缓存提供了强大的支持 。 您可以根据需要简单地开始,然后进行更多可定制的操作。 这将是spring提供的最简单的缓存形式的示例。 Sprin…

关于python的if条件语句,whilefor循环等的简单说。

if 条件1:# 语句体# elif 条件2:# 语句体# elif 条件3:# 语句体# else:# 语句体 #从键盘输入一个值# num 8# num1 int(input("请输入一个整数&#xff1a;"))if num1 num: print("您猜对了")elif num1 < num:print("您猜小了")else:print(…

haproxy配置代理tomcat和nginx_你真的掌握LVS、Nginx及HAProxy工作原理吗?

当前大多数的互联网系统都使用了服务器集群技术&#xff0c;集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务。图片来自 Unsplash这些集群可以是 Web 应用服务器集群&#xff0c;也可以是数据库服务器集群&#xff0c;还可以是分布式缓存服务器集群等等。在实…

PostgreSQL新手入门

自从MySQL被Oracle收购以后&#xff0c;PostgreSQL逐渐成为开源关系型数据库的首选。 本文介绍PostgreSQL的安装和基本用法&#xff0c;供初次使用者上手。以下内容基于Debian操作系统&#xff0c;其他操作系统实在没有精力兼顾&#xff0c;但是大部分内容应该普遍适用。 一、安…

使用Junit和Easytest进行数据驱动的测试

在本文中&#xff0c;我们将看到如何使用Junit进行数据驱动的测试。 为此&#xff0c;我将使用一个名为EasyTest的库。 众所周知&#xff0c;对于TestNG&#xff0c;它已内置了数据提供程序。 通过简单的测试&#xff0c;我们可以使用Junit进行数据驱动的测试。 什么是数据驱…

Matlab代码的耗时分析、优化、加速

Profile(分析&#xff09; 在加速你的matlab程序之前&#xff0c;你需要知道你的代码哪一部分运行最慢。matlab提供个简单的机制&#xff0c;让你能够知道你 的代码的某一部分运行所占用CPU时间。通过在代码段开始添加tic&#xff0c;及在结束添加toc&#xff1b;matlab就能计算…

python整数逆序输出_利用Python实现倒序任意整数

这是很早以前学习C时候做过的一个练习题&#xff0c;题目的要求大概是把用户输入的三位数倒序输出&#xff0c;比如说用户输入123&#xff0c;然后程序应该输出的结果是321。如果遇到用户输入100&#xff0c;那么程序应该输出1。然后我给扩展一下&#xff0c;这个程序来适应于三…

谜题61:日期游戏

下面的程序演练了Date和Calendar类的某些基本特性&#xff0c;它会打印出什么呢&#xff1f; import java.util.*;public class DatingGame {public static void main(String[ ] args) { Calendar cal Calendar.getInstance(); cal.set(1999, 12, 31); // Year, Month, Day Sy…

Java 中Thread的sleep、join、yield方法解析

1.Thread中sleep方法作用是使当前线程等待&#xff0c;其他线程开始执行&#xff0c;如果有线程锁&#xff0c;sleep不会让出锁 没有加锁代码如下&#xff1a; public class SynchronizedSleepMethod {public static void main(String[] args) {MoneyMethod moneyMethod new M…

MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?

Naresh Kumar是一位软件工程师与热情的博主&#xff0c;对编程与新事物充满了激情和兴趣。近日&#xff0c;Naresh撰写了一篇博文&#xff0c;对开源世界最常见的两种数据库MySQL与PostgreSQL的特点进行了详尽的分析和比对。 如果打算为项目选择一款免费、开源的数据库&#x…

jquery select change事件_jQuery实现省市联动效果

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><select name"province"id"province"><option >请选择</option></select><selec…

MATLAB上的GPU加速计算——学习笔记

MATLAB目前只支持Nvidia的显卡。如果你的显卡是AMD的或者是Intel的&#xff0c;就得考虑另寻它路了。 MATLAB可谓工程计算中的神器&#xff0c;一方面它自带丰富的函数库&#xff0c;另一方面它所有的数据都是内建的矩阵类型&#xff0c;最后画图也方便&#xff0c;因此解决一…

java中代码块的概述_Java代码质量工具–概述

java中代码块的概述最近&#xff0c;我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示&#xff1a; Java代码质量工具 以及更有意义的思维导图&#xff1a; 但是&#xff0c;我认为我需要更深入地探讨这一主题。 此博客文章应该像是在此方向上进行进一步调查的起点。 …

js原型、原型链、作用链、闭包全解

https://www.2cto.com/kf/201711/698876.html 【对象、变量】 一个对象就是一个类&#xff0c;可以理解为一个物体的标准化定义。它不是一个具体的实物&#xff0c;只是一个标准。而通过对象实例化得到的变量就是一个独立的实物。比如通过一个对象定义了“人”&#xff0c;通过…

Mysql 简介

一 简介&#xff1a;MySQL是最流行的开放源码SQL数据库管理系统&#xff0c;它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司&#xff0c;结合了开放源码价值取向、方法和成功的商业模型。 1.MySQL是一种数…

python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...

一.什么是装饰器&#xff1f; 实际上装饰器就是个函数&#xff0c;这个函数可以为其他函数提供附加的功能。 装饰器在给其他函数添加功能时&#xff0c;不会修改原函数的源代码&#xff0c;不会修改原函数的调用方式。 高阶函数&#xff0b;函数嵌套&#xff0b;闭包 &#xff…

Matlab 画图字体,字号的设定,图片大小和比例

figure_FontSize12; set(get(gca,XLabel),FontSize,figure_FontSize,Vertical,top); set(get(gca,YLabel),FontSize,figure_FontSize,Vertical,middle); set(findobj(FontSize,12),FontSize,figure_FontSize); %这4句是将字体大小改为8号字&#xff0c;在小图里很清晰 %set(gcf…

使用Speedment和Spring创建REST API

随着Spring Boot的第4版发布&#xff0c;为Web开发企业应用程序变得非常容易。 代表开发人员仍然需要大量时间的事情是&#xff0c;例如在Hibernate中对现有数据库进行建模&#xff0c;以获取数据的面向对象的视图。 在本教程中&#xff0c;我们将探索如何与开源一起使用开源工…

Phpstorm界面不停的indexing,不停的闪烁

选择 File->Invalidate Caches / Restart...->Invalidate and Restart&#xff0c;就行了&#xff01;转载于:https://www.cnblogs.com/php-no-2/p/9848606.html