Nginx入门

本文介绍了Nginx的基本概念,包括它作为高性能HTTP服务器、反向代理服务器和电子邮件代理服务器的角色。详细讲述了如何在Docker中安装Nginx,以及如何部署静态网站、设置虚拟主机、实现反向代理和负载均衡。还提到了Nginx解决跨域问题的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、nginx简介

1,什么是nginx

        Nginx 是⼀款⾼性能的 http 服务器/反向代理服务器及电⼦邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊⼽尔·⻄索夫(Igor Sysoev)所开发,官⽅测试 nginx 能够⽀撑 5 万并发链接,并且cpu、内存等资源消耗却⾮常低,运⾏⾮常稳定。

2,nginx应用场景

  • http 服务器:Nginx 是⼀个 http 服务可以独⽴提供 http 服务。可以做⽹⻚静态服务器。
  • 虚拟主机:可以实现在⼀台服务器虚拟出多个⽹站。例如个⼈⽹站使⽤的虚拟主机。
  • 反向代理,负载均衡:当⽹站的访问量达到⼀定程度后,单台服务器不能满⾜⽤户的请求时,需要⽤多台服务器集群可以使⽤ nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载⾼宕机⽽某台服务器闲置的情况。

3,docker安装nginx

1,搜索nginx镜像

docker search nginx

2,拉取nginx镜像

docker pull nginx

3,创建数据卷

创建数据卷来存放nginx容器中的相关数据,这里我将数据放到/root/nginx下,在该目录下,有以下四个目录:conf、conf.d、html、logs
其中conf中存放主配置文件,conf.d中存放子配置文件,html中存放静态资源文件,logs中存放日志文件。
在这里插入图片描述
接着在conf目录下创建主配置文件nginx.conf,粘贴下⾯内容:

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/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;
keepalive_timeout 65;
#gzip on;

include /etc/nginx/conf.d/*.conf;
}

4,创建并启动nginx容器

在nginx目录下执行以下命令:

docker run -id --name=c_nginx \
-p 80:80 \
-p 81:81 \
-p 82:82 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/conf.d:/etc/nginx/conf.d \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx

参数说明:

  • 冒号":“左边的代表的是宿主机的属性,冒号”:"右边的代表的是容器的属性
  • -p : 将容器上的指定端口映射到宿主机上的指定端口
  • -v : 将数据卷或其中的文件挂载到容器中指定的目录或文件上

二、nginx的使用

1,静态网站的部署

将静态资源(html页面)放到数据卷的html目录下或者放到nginx容器的/usr/share/nginx/html下即可;使用外部机器访问,默认端口是80

2,虚拟主机

所谓的nginx虚拟主机是指一个nginx容器可以提供多个端口,并且不同的端口可以对应不同的访问域名,同时对应不同的访问路径;例如在数据卷目录conf.d下添加一个子配置文件test.conf,如下:

server {
	listen 81;
	server_name www.xzk.com;
	location / {
		root /usr/share/nginx/cart;
		index cart.html;
	}
}
server {
	listen 82;
	server_name regist.xzk.com;
	location / {
		root /usr/share/nginx/search;
		index search.html;
	}
}

将两个静态资源目录cart和search放到容器的/usr/share/nginx/下,通过该配置文件,nginx容器提供了81和82两个端口,前面创建容器时配置好了端口映射,外部机器可以通过81、82端口进行访问。当客户端访问http://www.xzk.com:81/时,会访问到cart.html;当客户端访问http://regist.xzk.com:82/时,会访问到search.html;如此一来,便可以通过一个nginx容器来模拟多个网站。

注意:

  • 基于端口的虚拟主机和基于域名的虚拟主机提供服务的是同一个IP,也就是nginx容器所在宿主机的IP
  • 配置基于域名的虚拟主机时必须保证域名可用
  • 另外,也可以配置基于IP的虚拟主机,使用较少,这里不再介绍

3,反向代理

1,什么是反向代理

参考这篇文章什么是反向代理

2,配置反向代理

目标:通过nginx来代理tomcat中部署的一个项目

首先,在linux上启动一个tomcat容器,映射宿主机端口号8080,tomcat容器中有一个test项目,test项目中有一个index.html文件
接着,修改数据卷conf.d目录下的子配置文件,如下:

upstream tomcat{ #声明一个目标服务
    server 192.168.1.129:8080; #声明目标服务的地址
}
server {
   listen 80; # 监听的端口
   server_name localhost; # 域名或ip

   location / { # 访问路径配置
       root   /usr/share/nginx/html;# 根目录
       index  index.html index.htm; # 默认首页
   }

   error_page 500 502 503 504 /50x.html; # 错误页面
   location = /50x.html {
       root  html;
   }
}
server {
   listen 81; # 监听的端口
   server_name www.abc.com; # 域名或ip

   location / { # 访问路径配置
      # root   /usr/share/nginx/html;# 根目录
      # index  index.html index.htm; # 默认首页
        proxy_pass  http://tomcat;     #代理地址
   }
}

当客户端访问http://www.abc.com:81/tset时;nginx服务器会访问http://192.168.1.129:8080/test,然后将响应的结果返回给客户端,如下:
在这里插入图片描述

4,负载均衡

通过nginx代理访问目标服务时,默认采用轮询的方式进行负载均衡。启动三个tomcat容器,分别映射端口8080、8081、8082,修改上述配置文件,如下:

upstream tomcat{ #声明一个目标服务
    server 192.168.1.129:8080; #声明目标服务的地址
    server 192.168.1.129:8081;
    server 192.168.1.129:8082;
}
server {
   listen 80; # 监听的端口
   server_name localhost; # 域名或ip

   location / { # 访问路径配置
       root   /usr/share/nginx/html;# 根目录
       index  index.html index.htm; # 默认首页
   }

   error_page 500 502 503 504 /50x.html; # 错误页面
   location = /50x.html {
       root  html;
   }
}
server {
   listen 81; # 监听的端口
   server_name www.abc.com; # 域名或ip

   location / { # 访问路径配置
      # root   /usr/share/nginx/html;# 根目录
      # index  index.html index.htm; # 默认首页
        proxy_pass  http://tomcat;     #代理地址
   }
}

当客户端访问http://www.abc.com:81/tset时,nginx代理会轮询的去访问三个目标服务地址;如果其中⼀台服务器性能⽐较好,想让其承担更多的压⼒,可以设置权重。如下:

upstream tomcat{ #声明一个目标服务
    server 192.168.1.129:8080; #声明目标服务的地址
    server 192.168.1.129:8081 weight=2;
    server 192.168.1.129:8082;
}

则端口为8081的服务器的访问次数是其他服务器的2倍。

5,跨域配置

在前后端分离项目中会遇到跨域问题,其中后端一般是nginx接网关,可以在nginx处进行跨域配置。
nginx配置跨域,一般在响应头中加入如下4个请求头即可完美解决:

// 这个为请求头中的 origin
add_header 'Access-Control-Allow-Origin' '$http_origin' ;
add_header 'Access-Control-Allow-Credentials' 'true' ;
add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;

nginx 配置跨域,可以为全局配置和单个代理配置(两者不能同时配置)

  • 全局配置;在主配置文件下
http {
    # 跨域配置
    add_header 'Access-Control-Allow-Origin' '$http_origin' ;
    add_header 'Access-Control-Allow-Credentials' 'true' ;
    add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
    add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;

  • 局部配置(单个代理配置跨域), 在路径匹配符中加入跨域信息;在子配置文件下
upstream tomcat{ #声明一个目标服务
    server 192.168.1.129:8080; #声明目标服务的地址
    server 192.168.1.129:8081;
    server 192.168.1.129:8082;
}
server {
   listen 80; # 监听的端口
   server_name localhost; # 域名或ip

   location / { # 访问路径配置
       root   /usr/share/nginx/html;# 根目录
       index  index.html index.htm; # 默认首页
   }

   error_page 500 502 503 504 /50x.html; # 错误页面
   location = /50x.html {
       root  html;
   }
}
server {
   listen 81; # 监听的端口
   server_name www.abc.com; # 域名或ip

   location / { # 访问路径配置
   		# 这里配置单个代理跨域,跨域配置
         add_header 'Access-Control-Allow-Origin' '$http_origin' ;
         add_header 'Access-Control-Allow-Credentials' 'true' ;
         add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
         add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;

      # root   /usr/share/nginx/html;# 根目录
      # index  index.html index.htm; # 默认首页
        proxy_pass  http://tomcat;     #代理地址
   }
}

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我待Java如初恋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值