1、简介
Nginx是一款高性能、轻量级的Web服务器和代理服务器,它采用事件驱动的异步模型,可以支持高并发的访问量。
Nginx的优点在于它既可以作为静态资源服务器,又可以支持动态请求,同时还能够快速地处理HTTP请求。因此,除了用作Web服务器之外,许多大型网站和应用程序也将Nginx作为负载均衡服务器使用,以提高可用性和性能。
2、安装运行
2.1 Windows下载安装
下载地址:nginx: download
下载后点击nginx.exe
文件运行,访问地址:http://localhost
正常显示“Welcome to nginx!”页面说明运行成功。
2.2 Linux 命令安装
以CentOS为例,通过yum
命令安装。
sudo yum install epel-release
sudo yum install nginx
安装后通过whereis nginx
命令可以查看安装后的一些路径,如:
-
文件资源(html)路径:
/usr/share/nginx/html/
-
配置文件路径:
/etc/nginx/
-
运行文件路径:
/usr/sbin/nginx
2.3 Linux 编译安装
PS:推荐编译安装
编译安装的好处就是文件都在一个文件夹里面,不会像命令行安装那样很分散。
1、安装编译Nginx所需的依赖项
yum install gcc pcre-devel openssl-devel zlib-devel
2、wget命令下载最新的Nginx源代码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
3、使用tar命令对下载的Nginx源代码文件进行解压缩
tar -zxvf nginx-1.24.0.tar.gz
4、配置Nginx编译参数
# 进入nginx目录下
cd nginx-1.24.0
# 配置参数
./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre \
--with-openssl=/usr/local/openssl
参数含义如下:
--prefix:指定安装路径
--with-http_stub_status_module:启用stub_status模块
--with-http_ssl_module:启用SSL模块
--with-pcre:启用pcre模块
--with-openssl:指定安装的OpenSSL库的路径
5、编译和安装
# 编译
make
# 安装
make install
6、启动Nginx
# 进入安装后的目录
cd /usr/local/nginx/sbin/
# 运行
./nginx
当安装了Nginx之后,它的目录结构通常如下所示:
├── bin
│ └── nginx
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi_params
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── nginx.conf
│ ├── scgi_params
│ ├── uwsgi_params
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
└── sbin
└── nginx
2.4 常用命令
# 启动Nginx服务
systemctl start nginx
# 停止Nginx服务
systemctl stop nginx
# 重启Nginx服务
systemctl restart nginx
# 查看Nginx的状态
systemctl status nginx
# 查看Nginx版本
nginx -v
# 检查Nginx配置文件是否正确
nginx -t
# 重新加载Nginx配置文件
nginx -s reload
2.5 修改端口号
有时候运行失败,可能是80端口被占用了,需要修改端口号。
配置文件路径:conf/nginx.conf
listen 80;
-
可以将
listen 80;
修改为listen 8080。
修改后需要通过nginx -s reload
命令重新启动Nginx服务。Windows系统点击nginx.exe
文件重新运行。
3、Web 服务
3.1 部署静态资源
Nginx可以非常方便地部署静态资源,例如 JavaScript、CSS、HTML 文件等。只需要在 Nginx 的配置文件中添加一个配置项 location
,将请求重定向到静态资源所在的目录即可。
例如:
server {
listen 80 default_server; # 监听端口号 80
root /usr/share/nginx/html; # 静态资源所在目录
index index.html; # 默认索引页
location / {
try_files $uri $uri/ =404; # 根据 URL 请求寻找对应静态资源
}
}
这里将所有请求重定向到 /usr/share/nginx/html
目录,根据 URL 请求自动寻找对应静态资源。如果找不到对应文件,则返回 404 错误。
3.2 Https 配置
要配置 HTTPS,需要获取 SSL/TLS 证书。通常需要购买或从免费证书发行机构中获取。要将证书配置到 Nginx,需要在配置文件中添加以下内容:
server {
listen 443 ssl; # 监听端口 443,并启用 SSL
ssl_certificate /path/to/cert.pem; # SSL 证书的路径
ssl_certificate_key /path/to/key.pem; # SSL 私钥的路径
location / {
# 配置 HTTPS 请求的转发
}
}
这里启用 SSL,并设置 SSL 证书和私钥的路径。
4、Http 代理
正向代理和反向代理的概念:
-
正向代理是指代理服务器代理「客户端」,使得客户端可以访问被代理的服务器上的资源。举个例子,我们可以使用正向代理访问一些境外网站,这些网站被代理服务器所代理,客户端看到的是代理服务器响应的内容。这时,被代理的服务器并不知道客户端的存在,只知道代理服务器的存在。正向代理主要应用于隐藏客户端的 IP 地址、访问互联网被封锁的资源等场景。
-
反向代理则是代理服务器代理「服务器端」,为服务器端提供负载均衡、缓存、SSL 加密和安全防御等服务。举个例子,在一个负载均衡的系统中,反向代理服务器可以根据负载均衡算法选择合适的服务器,将客户端的请求转发到选中的服务器上,然后将处理结果返回给客户端。在这种情况下,客户端并不知道请求被转发到了哪个服务器上,只知道反向代理服务器的存在。反向代理主要应用于提供数据的安全性、速度以及弹性等方面。
4.1 正向代理
需在 Nginx 配置文件中添加以下内容:
location / {
proxy_pass http://backend-service;
}
这里将所有请求转发到名为 backend-service
的后端服务,可以代替客户端向服务端请求。
4.2 反向代理
反向代理是指将客户端请求通过反向代理服务器再转发给内部的服务器处理。
upstream backend {
server backend1.example.com; # 内部服务 1
server backend2.example.com; # 内部服务 2
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; # 所有请求转发给 upstream
}
}
这里将来自客户端的所有请求转发到名为 backend
的 upstream 中。Nginx 根据配置向其中的后端服务转发请求。可以根据需要添加更多的 server。
4.3 反向代理真实的 IP 地址
当使用反向代理时,如果在后端服务中需要获取客户端的真实 IP 地址,可以通过 Nginx 配置来实现。
例如:
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
}
这里设置 X-Real-IP
头并将其设置为客户端的真实 IP 地址。
4.4 代理接口
当使用反向代理时,有时需要设置代理接口来处理某些请求。可以在 Nginx 中使用 location
指令来设置代理接口。
例如:
location /api {
proxy_pass http://backend/;
}
这里设置代理接口为 /api
,代理地址为 http://backend/
。
5、TCP/UDP 代理
nginx的stream模块可以用来处理TCP和UDP的代理。
在根目录下配置stream
,可以用作UDP和TCP的代理,比如可以直接转发MySQL的数据。
# TCP/UDP协议的代理和负载均衡配置
stream {
# TCP协议的代理和负载均衡
server {
listen 8888; # 监听TCP端口号
proxy_pass backend_server; # 反向代理至后端服务器
}
# UDP协议的代理和负载均衡
server {
listen 6666 udp; # 监听UDP端口号
proxy_pass backend_server; # 反向代理至后端服务器
}
}
-
注意在http节点下配置stream和根目录下配置stream是不一样的,在http块下配置只能代理htpp协议。
6、配置可以跨域
配置文件nginx/conf/nginx.conf
,找到server
块, 在location
块添加如下配置:
location / {
# 设置允许跨域的域名和端口 * 表示所有
add_header Access-Control-Allow-Origin *;
# 也可以设置只允许某个域名访问
# add_header Access-Control-Allow-Origin 'http://allowdomain.com:8080';
# 允许跨域的方法
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
# 允许跨域的请求头
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
# 是否跨域携带cookie
add_header Access-Control-Allow-Credentials 'true';
}
7、负载均衡
7.1 Http 负载均衡
下面是一个基本的 Nginx 负载均衡的示例:
http {
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
在上面的示例中,我们定义了一个名为 backend
的负载均衡器,并设定了三个不同的后端服务器。其中,backend1.example.com
的权重是 5,而其他两个服务器的权重是默认的 1。
server
将监听端口设置为 80,并且将请求转发到名为 backend
的负载均衡器上。
7.2 负载均衡策略
Nginx 支持多种负载均衡策略,其中常见的有以下几种:
-
轮询(默认):依次将请求分发到每个服务器上,按照设定的权重大小比例。
-
IP 哈希:将客户端的 IP 地址作为哈希函数的参数,然后将请求分发到哈希值对应的服务器上。
-
最少连接:将请求发送到当前连接数最少的服务器上。
-
URL 哈希:将客户端的 URL 地址作为哈希函数的参数,然后将请求分发到哈希值对应的服务器上。
要指定负载均衡策略,可以在 upstream
的配置中设置,例如:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# IP 哈希
ip_hash;
# 最少连接
# least_conn;
# URL 哈希
# hash $request_uri consistent;
}
8、总结
Nginx是一款高性能、灵活性强的Web服务器和代理服务器,具有轻量级、高性能、高可靠性、低资源占用率的特点,适用于处理海量请求的高并发环境。本文介绍了Nginx的安装方法、基本配置、常用命令、正向代理、反向代理、负载均衡等方面内容。