nginx配置web服务|反向代理|负载均衡
Nginx 配置文件通常位于 /etc/nginx/nginx.conf
或者 /usr/local/nginx/conf/nginx.conf
,具体位置取决于你的系统和安装方式。配置文件是 Nginx 的核心,用于定义服务器如何运行以及如何处理请求。
http模块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/mime.types;
}
解释各个部分
user:定义运行 Nginx 进程的用户和组。
worker_processes:指定 Nginx 应该启动的工作进程数量。
error_log:定义错误日志的位置。
pid:定义 Nginx 进程 ID 文件的位置。
events:配置事件处理模型,如 worker_connections 设置每个工作进程可以同时打开的最大连接数。
http:这是 Nginx 配置的主要部分,包括全局设置、虚拟主机配置等。
include
:用于包含其他配置文件。log_format
和access_log
:用于定义访问日志的格式和位置。sendfile
,tcp_nopush
,tcp_nodelay
,keepalive_timeout
:这些是提高性能和优化网络传输的选项。types_hash_max_size
:用于缓存 MIME 类型的大小限制。include
:最后两个include
语句用于包含额外的配置文件,比如站点配置或模块配置。
server模块(虚拟主机配置)
在 http
块中,你可以定义多个 server
块来配置不同的虚拟主机。每个 server
块可以有以下参数:
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.html index.htm;
# 直接指定“/”可代替上面的“root”,能更灵活的配置其他选项
location / {
try_files $uri $uri/ =404;
}
# 更多 location 块用于更详细的 URL 路径匹配和处理
}
- listen:定义服务器监听的端口和地址。
- server_name:定义域名或 IP 地址。可配置二级域名。
- root:定义网站根目录。
- index:定义默认索引文件,如果根目录下的默认文件不叫index.html而叫app.html,那么需配置index为app.html。
- location:定义 URL 的路径匹配规则和处理方式。
location模块
server模块中的 location
块是用来定义如何处理与特定 URL 模式匹配的 HTTP 请求的。location
块允许你针对不同的 URL 路径指定不同的处理逻辑,比如静态文件服务、动态内容处理、重定向、反向代理、负载均衡等。下面详细解释 location
的不同用法和语法:
基本语法
location
块的基本语法如下:
location [=|~|~*|^~] /pattern {
# 处理逻辑
}
其中 /pattern
是 URL 路径的模式,可以是精确的字符串、正则表达式或其他匹配类型。
匹配类型
假设我在/data/icons/目录下有三个文件favicon1.ico、favicon2.ico、favicon3.ico
等号匹配(=
)
当使用等号作为前缀时,location
将只匹配完全相等的 URL 路径。这是最高效的匹配类型,因为 Nginx 可以直接查找而无需进行正则表达式匹配。
location = /favicon1.ico {
root /data/icons;
}
正则匹配(~
)
使用波浪线作为前缀时,location
将使用正则表达式来匹配 URL 路径。
location ~ /favicon[2-3].ico {
root /data/icons;
}
忽略大小写的正则匹配(~*
)
类似正则匹配,但忽略大小写。我们将favicon3.ico改成Favicon3.ico。
location ~* /favicon[2-3].ico {
root /data/icons;
}
此时按照我们所理解的,访问example.com/favicon3.ico应该能正常显示,其实不然!需要访问example.com/Favicon3.ico才能正常显示。
为什么呢?
因为,只是url和nginx这行配置忽略大小写,让url走这行配置的规则,并不是url和实际访问资源忽略大小写。实际访问的时候还是要和资源名称大小写一致。
常见指令
在 location
块内,你可以定义一系列指令来处理匹配到的请求。常见的指令包括:
root
:设置该location
下的文档根目录。alias
:与root
类似,但是alias
直接映射 URL 到文件系统路径。try_files
:尝试按给定顺序查找文件。如果找不到,可以指定一个默认处理程序,如转发到后端应用。proxy_pass
:用于设置反向代理,访问服务而非静态资源用这个。rewrite
:用于重写 URL 或重定向请求。return
:立即返回一个 HTTP 响应码和可选的内容。
嵌套 location
location
块可以嵌套在另一个 location
块内,允许更精细的控制。例如:
location / {
root /www/;
location ~ \.php$ {
root /var/www/;
fastcgi_pass 127.0.0.1:9000;
}
}
在这个例子中,所有请求都默认指向 /www/
根目录,但 .php
扩展名的请求会被特殊处理,指向 /var/www/
并通过 FastCGI 发送给 PHP 处理器。
反向代理
假设你有一个后端应用服务器运行在本地的 8000 端口,并且你想通过 Nginx 将所有对 example.com
的请求代理到这个后端服务器,你可以使用以下配置:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选的其他配置
proxy_redirect off;
proxy_buffering off;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
}
}
解释配置
listen 80;
:监听 80 端口上的请求。server_name example.com;
:指定服务器名称,确保只有对example.com
的请求被处理。location / { ... }
:定义所有请求都应该被代理。proxy_pass http://127.0.0.1:8000;
:将请求转发到本地的 8000 端口。proxy_set_header
:设置代理传递的头部信息。这很重要,因为后端服务器可能需要知道原始客户端的信息。- 其他
proxy_
配置:这些设置用于优化代理连接的性能和可靠性。
负载均衡
在 Nginx 中配置负载均衡可以让你在多台后端服务器之间分配客户端的请求,以提高应用程序的可用性和响应速度,同时也可以增加系统的冗余度。以下是使用 Nginx 配置基于轮询(round-robin)策略的简单负载均衡的步骤和示例配置:
步骤 1: 定义 Upstream 块
首先,你需要定义一个 upstream
块,它将包含一组后端服务器的列表。这个 upstream
块可以被多个 location
块引用,用于负载均衡。
步骤 2: 配置 Server 和 Location 块
接着,在 server
块中使用 location
块来指定哪些请求应该被代理到定义好的 upstream
。这样,Nginx 将根据负载均衡策略将请求分发到不同的后端服务器。
示例配置
假设你有两台后端应用服务器,分别运行在 backend1.example.com:8000
和 backend2.example.com:8000
,你可以使用以下配置来实现负载均衡:
upstream backend {
server backend1.example.com:8000;
server backend2.example.com:8000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
解释配置
upstream backend { ... }
:定义了一个名为backend
的上游服务器组,包含了两台后端服务器。server backend1.example.com:8000;
和server backend2.example.com:8000;
:指定了后端服务器的地址和端口。proxy_pass http://backend;
:告诉 Nginx 将请求代理到backend
上游服务器组。
负载均衡策略
Nginx 默认使用轮询(round-robin)策略,但你也可以使用其他策略,如最少连接(least connections)或哈希(hash)策略。例如,为了使用最少连接策略,你可以修改 upstream
块如下:
upstream backend {
least_conn;
server backend1.example.com:8000;
server backend2.example.com:8000;
}
在这个配置中,least_conn;
指令告诉 Nginx 选择连接数最少的服务器来处理新的请求。还有其他策略配置可自行百度,这里不做赘述。
以上是我在实际使用nginx时常用的配置,剩余的配置在实际使用后再做持续补充~
Q&A
1.location里root和alias的区别是什么?
在 Nginx 的 location
块中使用 root
和 alias
指令时,它们之间的主要区别在于如何解析 URL 到实际的文件系统路径。尽管这两个指令都用于指定文件的根目录,但它们的工作方式有所不同。
**root**
指令
root
指令用于设定一个基准目录,当与 location
结合使用时,Nginx 会将请求的 URI(统一资源标识符)附加到 root
目录的后面,然后查找对应的文件或目录。这意味着,如果 root
设定为 /data/icons
,并且 URL 请求为 /img/favicon1.ico
,那么 Nginx 会尝试在 /data/icons/img/fabicon1.ico
查找文件。
示例:
location / {
root /data/icons;
# 请求 /img/favicon1.ico 会查找 /data/icons/img/favicon1.ico
}
**alias**
指令
alias
指令则是用来做 URL 到文件系统路径的直接映射。当使用 alias
时,URL 的路径部分将被完全替换为 **alias**
指定的路径,而不是附加到其后。这意味着,如果 alias
设定为 /data/icons/img/
,并且 URL 请求为 /img/favicon1.ico
,那么 Nginx 将在 /data/icons/img/favicon1.ico
直接查找文件,而不会把 /img/
加在 alias
指定的路径后面。
示例:
location /img/ {
alias /data/icons/img/;
# 请求 /img/favicon1.ico 会查找 /data/icons/img/favicon1.ico
}
选择使用 root
还是 alias
主要取决于你的具体需求。
一般情况下,nginx配置的良好习惯是:
- 在location /中配置root目录
- 在location /path中配置alias目录
nginx配置web服务|反向代理|负载均衡的更多相关文章
- 【05】Nginx:TCP / 正向 / 反向代理 / 负载均衡
写在前面的话 在我们日常的工作中,不可能所有的服务都是简单的 HTML 静态网页,nginx 作为轻量级的 WEB 服务器,其实我们将它用于更多的地方还是作为我们网站的入口.不管你是后端接口,还是前端 ...
- linux nginx服务 反向代理 负载均衡 nfs服务
一.nginx服务 1.首先软件停用firewall #systemctl stop firewalld stop:本次停用 disable:开机停用 enable:开机启用 #ps aux | gr ...
- nginx之rewrite重写,反向代理,负载均衡
rewrite重写(伪静态): 在地址栏输入xx.com/user-xxx.html, 实际上访问的就是xxx.com/user.php?id=xxx rewrite就这么简单 附上ecshop re ...
- 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器
Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...
- Nginx 反向代理 负载均衡 虚拟主机配置
Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...
- 十.nginx反向代理负载均衡服务实践部署
期中集群架构-第十章-nginx反向代理负载均衡章节章节====================================================================== 0 ...
- 【转】Nginx 反向代理 负载均衡 虚拟主机配置
原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...
- Centos7.4 Nginx反向代理+负载均衡配置
Ningx是一款高性能的HTTP和反向代理服务器,配置起来也比较简单. 测试环境: 172.16.65.190 Nginx-反向代理 172.16.65.191 Ningx-Web 172.16.65 ...
- 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现
实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...
- nginx 详解反向代理负载均衡
什么是反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度.因此也可以考虑使用这种技术,让代理服务器将请求 均匀转发给多台内部Web服务器 ...
随机推荐
- Python做点击率数据预测
点击率(Click-Through Rate, CTR)预测是推荐系统.广告系统和搜索引擎中非常重要的一个环节.在这个场景中,我们通常需要根据用户的历史行为.物品的特征.上下文信息等因素来预测用户点击 ...
- AWX+gitlab
目录 AWX+gitlab 1. Awx配置 1.1 添加机构 1.2 添加团队 1.3 添加主机 1.4 测试主机连通性 2. 对接gitlab 2.1 添加凭证 2.2 添加项目 2.3 上传pl ...
- WPF 做一个超级简单的 1024 数字接龙游戏
这是一个我给自己做着玩的游戏,没有什么复杂的界面,就一些简单的逻辑 游戏的规则十分简单,那就是有多个列表.程序会给出一个数字,玩家决定数字放在哪个列表里面.如果放入列表里面的数字和列表里面最后一个数字 ...
- .NET 个人博客-发送邮件优化🧐
个人博客-发送邮件优化 前言 之前的发送邮件就弄了个方法,比如回复评论会给评论的人发送邮件,留言回复也是,而且2者的代码有很多一样的地方,比较冗余.然后也是抽空优化一下,思路也是比较常用的工厂+策略模 ...
- vim 中代码的折叠和打开
# vim 中代码的折叠和打开 reference: vim中代码的折叠和打开(有删改) https://www.cnblogs.com/xuxm2007/archive/2011/11/10/224 ...
- Python_10 debug、类和对象
一.查缺补漏 APP测试流程梳理https://www.cnblogs.com/dengqing9393/p/6497068.html 有关类的知识点http://testingpai.com/art ...
- React项目国际化-React-intl
npx create-react-app react-intl-demo && cd react-intl-demo,创建react-intl-demo项目.npm install r ...
- vulnhub - BREACH: 1
vulnhub - BREACH: 1 描述 作为多部分系列中的第一部分,Breach 1.0 旨在成为初学者到中级的 boot2root/CTF 挑战.解决将需要可靠的信息收集和持久性相结合.不遗余 ...
- 请解释一下 JavaScript 的同源策略?
概念:同源策略是客户端脚本(尤其是Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载.这里的同源策略指的是: 协议,域名,端口 相同,同源策略是一种安全协议.指一 ...
- Oracle plsql中文字段乱码,where条件中文字段搜不到结果集
设置系统环境变量 变量名:NLS_LANG 变量值:AMERICAN_AMERICA.ZHS16GBK