文章目录
一、什么是Nginx
Nginx是一款高性能、轻量级的网页服务器,采用事件驱动的异步非阻塞处理框架,它主要应用于静态文件服务、负载均衡、正向代理和反向代理等场景,在互联网项目中被广泛应用。
二、为什么需要Nginx
举个例子:
- 由于我们开发项目时,前端页面调用后端服务,ip地址都是在公司的局域网内,自然是能互相通信的。
- 但当我们将项目部署到公网上时,就需要将前端系统界面的地址通过Nginx代理服务器进行转发,才能被局域网外的用户访问到。
- 然而此时用户只能成功访问页面,后台的服务仍处于局域网下,需要前端通过Nginx做一下转发才能让用户正常的访问后台服务。
上述过程中,前端页面和后台服务的转发都用到了Nginx,如下图所示:
三、Nginx的应用场景
1. 静态资源(动静分离)
Nginx 服务器会将接收到的请求分为动态请求和静态请求,这样能减轻服务器的压力,同时使项目结构更加规范,方便开发和部署:
- 静态请求直接从Nginx服务器所设定的根目录路径去获取对应的资源
- 动态请求转发给后台服务器
具体的配置在nginx.conf文件里:
http {
# 部分内容略去
upstream backservice {
server 192.168.1.123:8080;
}
# 虚拟机(服务)列表
server {
# 监听所有地址的80端口,也可以指定IP
listen 80;
server_name localhost;
location / {
# 指定访问的静态文件夹,用来存放静态资源
root /app/dist;
# 指定index页面
# index index.html index.htm;
# 这个字段指定当前uri 访问的文件顺序,
# 即uri没有的话就访问uri/ 依次到index.html、404.
try_files $uri $uri/ /index.html =404;
}
# 后台服务
location /backservice/ {
proxy_pass http://backservice/;
}
}
2. 负载均衡
很多中间件都应用到了负载均衡技术,Nginx常用的几种负载均衡的方式:
2.1 轮询(默认)
顾名思义,每一个客户端的请求会按时间顺序轮流分配到不同的服务器上,如果后端服务down掉,会自动过滤。
upstream backservice{
server 192.168.1.123:8080;
server 192.168.1.124:8080;
}
2.2 weight 权重(Nginx自带)
如果后端服务器性能不均衡,可以使用权重法来指定轮询的几率,权重越高,被分配的次数越多。
upstream backservice{
server 192.168.1.123:8080 weight=1;
server 192.168.1.124:8080 weight=3;
server 192.168.1.125:8080 weight=4;
}
2.3 ip_hash(Nginx自带)
- 该方法主要是为了解决session会话的问题,如果客户端已经访问了某个服务器,如果再次登录被分配到了另一个服务器,那么客户的登录信息就丢失了
- 所以采用ip_hash方法将每个请求按照访问ip的hash结果进行分配,这样就能保证同一个用户会固定访问一个后端服务器,保证了session会话
upstream backservice{
ip_hash;
server 192.168.1.123:8080;
server 192.168.1.124:8080;
}
2.4 least_conn(Nginx自带)
将请求转发给连接数较少的后端服务器。
upstream backservice{
least_conn;
server 192.168.1.123:8080;
server 192.168.1.124:8080;
}
2.5 fair(第三方)
fair是按照服务器端的响应时间来分配请求,响应时间短的服务器优先分配,需要安装第三方的插件。
upstream backservice{
fair;
server 192.168.1.123:8080;
server 192.168.1.124:8080;
}
3. 反向代理
接下来就是Nginx的重头戏了——反向代理,什么是反向代理呢?举个例子:
- 你是一名刚毕业的大学生,来到新的城市要租房
- 于是租房中介找到你说:“我可以为您提供服务,xx区有几套房源在租,您想要哪一套呢?”
- 你问中介:“这些房子的房东是谁?他们的电话号码是多少?”
- 中介答:“这些你不用管了,你只需要享受我的服务就好,房东是谁不重要,你能找到好住处就是我的职责!”
- 这里的你就是客户端Client,房东就是服务端Server,中介就是代理Proxy;
- 房东通过中介向你提供房源,你不知道房源具体是谁的,因为你只能接触到中介;
- 同理,反向代理将服务端保护了起来,客户端只能通过代理服务器访问服务,无法获得服务端的真实地址。
- 反向代理是实现负载均衡的基础,同时也支持实现跨域
4. 正向代理
反向代理讲完了,那么什么是正向代理呢?还是租房的例子:
- 你问中介:“给我在xx区找几套好房子。”
- 中介赶紧联系房东:“有人相中您这套房子了,您什么时候搬走呢?”
- 房东说:“谁呀,这么着急?我还没收拾完呢!”
- 中介:“这您就别管是谁问的啦,早点搬走您就早点过上躺着收房租的生活~”
- 房东:“好,我明天就搬走!”
- 中介回来对你说:“xx街道xx小区那个房东明天就搬走,这是他的房源信息,您过目。”
- 这里的房东作为服务端不知道谁在向他发起请求,他只能感受到代理的存在
- 其实我们的上网的过程也是正向代理,通过代理服务器访问目标网址,vpn会将访问外面的服务器server的网页请求,代理到服务器proxy上,proxy把外面的服务器 server上获取的网页内容,再转发给客户。
四、怎么用Nginx
Nginx的使用主要靠nginx.conf配置文件,在这里修改代理转发,以及控制资源大小、响应时间等,以下是一个示例,包括静态文件服务、反向代理、负载均衡等功能:
user nginx; #指定 Nginx 进程的运行用户,这里设置为 nginx 用户。
worker_processes 1; # 设置 Nginx 进程的数量,一般根据服务器性能来设置。这里设置为1,表示只有一个工作进程。
error_log /var/log/nginx/error.log warn; # 指定错误日志文件的位置和日志级别
pid /var/run/nginx.pid; # 指定 Nginx 主进程的PID文件
events {
worker_connections 1024; # 配置Nginx事件模块,设置最大连接数,这里设置每个 worker进程最大连接数为 1024。
}
http { # 配置HTTP服务器的行为,包括监听端口、日志格式、代理、负载均衡等
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 设置请求体的最大限制 默认是1m;
client_max_body_size 20m;
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; # 开启 sendfile 功能,用于高效传输文件
#tcp_nopush on;
keepalive_timeout 65; # 设置 HTTP keep-alive 连接的超时时间
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件
gzip_min_length 1k;
# gzip 压缩级别, 1-10,数字越大压缩越好,但cpu消耗越高,且压缩效果不会明显提升,一般设置在2-4
gzip_comp_level 4;
# 压缩的文件类型
gzip_types text/html text/css application/javascript application/x-javascript text/javascript application/octet-stream application/font-woff;
# add_header Access-Control-Allow-Headers Authorization;
# underscores_in_headers on;
# 负载配置
upstream usersvr {
server 192.168.1.123:8089;
}
upstream metasvr {
server 192.168.1.124:8087;
}
upstream productsvr {
server 192.168.1.125:30083;
}
# 虚拟机(服务)列表
server {
# 监听所有地址的80端口,也可以指定IP
listen 80;
server_name localhost;
location / {
# 指定访问的静态文件夹
root /app/dist;
# 指定index页面
# index index.html index.htm;
# 这个字段指定当前uri 访问的文件顺序,
# 即uri没有的话就访问uri/ 依次到index.html、404.
try_files $uri $uri/ /index.html =404;
}
# 用户服务
location /oauth/ {
# 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 HTTP_AUTHORIZATION $http_authorization;
# proxy_set_header X-NginX-Proxy true;
proxy_pass http://usersvr/oauth/;
}
# 元数据服务
location /meta/ {
proxy_pass http://metasvr/;
}
# 产品服务
location /product/ {
proxy_pass http://productsvr/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
另外还有一些经常用到的路径:
- nginx配置文件路径
/usr/local/etc/nginx/nginx.conf
- nginx服务器默认的根目录
/usr/local/var/www
- nginx的安装路径
/usr/local/Cellar/nginx/1.18.0
- nginx默认的日志路径
/usr/local/var/log/nginx/error.log
如果nginx服务出现问题,可以通过查看错误日志来进行排查:
tail -fn 200 /usr/local/var/log/nginx/error.log # 实时查看最新200行日志
通常情况下问题出在nginx.conf文件里,可能是里面的某些配置项没配置对,或者upstream、location命名不一致未成功匹配等,找到问题修改好nginx.conf后,重启nginx服务即可:
sudo nginx -s reload # 热重启nginx
好了,以上就是关于nginx的一些概念和常用配置、指令,写成此文学习记录!