1、概念
1.1 介绍
Nginx是一个高性能的开源Web服务器软件,也可以用作反向代理服务器、负载均衡器和HTTP缓存。它的设计目标是高性能、稳定性、丰富的功能和低资源消耗。
1.2 应用场景
- Web服务器:Nginx可以作为静态资源服务器,处理静态文件的请求,提供高性能的Web服务。
- 反向代理服务器:Nginx可以代理后端服务器,接收客户端的请求并将其转发给后端服务器,实现负载均衡和高可用性。
- 负载均衡器:Nginx可以分发客户端请求到多个后端服务器,实现负载均衡,提高系统的整体性能和可靠性。
- HTTP缓存:Nginx可以缓存静态文件和动态页面,减轻后端服务器的压力,提高网站的访问速度。
1.3 反向代理
反向代理是指代理服务器接收来自客户端的请求,然后将这些请求转发给后端服务器,最终将后端服务器的响应返回给客户端。客户端只知道代理服务器的存在,而不知道后端服务器的信息。有以下优点:
- 隐藏后端服务器:客户端无法直接访问后端服务器,增强了安全性。
- 负载均衡:可以将请求分发给多个后端服务器,提高性能和可靠性。
- 缓存:代理服务器可以缓存响应,减轻后端服务器压力。
在Nginx中,使用proxy_pass
指令来设置反向代理。例如:proxy_pass http://backend_server;
1.4 负载均衡
负载均衡是指将请求分发给多个后端服务器,以实现负载均衡、提高性能和可靠性。常见的负载均衡算法包括轮询、加权轮询、最少连接等。有以下优点:
- 提高性能:将请求分发给多个服务器,减轻单个服务器的压力。
- 提高可靠性:当某个服务器出现故障时,负载均衡器可以将请求转发给其他正常的服务器。
- 横向扩展:可以随时添加或移除后端服务器,实现系统的横向扩展。
在Nginx中,可以使用upstream
块定义后端服务器组,然后在location
块中使用proxy_pass
指令将请求代理到这个后端服务器组。例如:
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
}
location / {
proxy_pass http://backend_servers;
}
2、Linux部署
2.1 安装
ubuntu安装命令如下:
sudo apt update
sudo apt install nginx
2.2 访问测试
安装完成后查看服务状态为running:
通过网线与开发板连接,直接在电脑浏览器上输入开发板IP进行访问:
2.3 常用命令
常用命令如下:
命令 | 描述 |
---|---|
nginx -h | 显示帮助信息 |
nginx -v | 显示版本信息 |
nginx -V | 显示版本信息和配置选项并退出 |
nginx -t | 测试配置文件是否正确并退出 |
nginx -T | 测试配置文件是否正确并将其转储并退出 |
nginx -q | 在配置测试期间抑制非错误消息 |
nginx -s signal | 向主进程发送信号:stop, quit, reopen, reload |
nginx -p prefix | 设置前缀路径(默认值:/usr/share/nginx/) |
nginx -c filename | 设置配置文件(默认值:/etc/nginx/nginx.conf) |
nginx -g directives | 设置全局指令,超出配置文件之外 |
3、配置文件详解
3.1 配置文件位置和格式
配置文件一般位于:/etc/nginx/nginx.conf。
其大致格式如下:
events {
// 全局事件配置
}
http {
// 全局HTTP配置
server {
// 服务器配置
location / {
// 路径配置
}
}
}
3.2 events块
在events
块中,可以配置一些与Nginx服务器的事件相关的参数。
3.2.1 worker_connections
-
作用:设置每个工作进程允许的最大并发连接数。
-
取值:整数。默认值取决于系统的最大文件描述符数,通常为1024或更高。
events {
worker_connections 1024;
}
3.2.2 use
-
作用:指定事件驱动模块,用于处理连接和请求。
-
取值 :
epoll
、kqueue
、eventport
、/dev/poll
等,取决于操作系统和Nginx编译时的选项。events {
use epoll;
}
3.2.3 multi_accept
-
作用:允许一个工作进程同时接受多个新连接。
-
取值 :
on
或off
。默认为off
。events {
multi_accept on;
}
3.2.4 worker_processes
-
作用:指定启动的工作进程数。
-
取值:整数。通常设置为CPU核心数的倍数,以充分利用多核处理器。
events {
worker_processes 4;
}
3.3 http块
http块的常见配置整理如下:
配置指令 | 作用 | 取值 | 示例 |
---|---|---|---|
worker_processes | 工作进程数 | 整数 | worker_processes 4; |
worker_connections | 每个工作进程的最大连接数 | 整数 | worker_connections 1024; |
include | 包含其他配置文件 | 文件路径 | include /etc/nginx/conf.d/*.conf; |
default_type | 默认MIME类型 | MIME类型 | default_type application/octet-stream; |
error_log | 全局错误日志文件路径 | 文件路径 | error_log /var/log/nginx/error.log; |
sendfile | 启用直接文件传输 | on 或off |
sendfile on; |
tcp_nopush | 启用TCP_NOPUSH选项 | on 或off |
tcp_nopush on; |
tcp_nodelay | 启用TCP_NODELAY选项 | on 或off |
tcp_nodelay on; |
keepalive_timeout | Keep-alive连接超时时间 | 整数(秒) | keepalive_timeout 65; |
types_hash_max_size | MIME类型哈希表最大尺寸 | 整数 | types_hash_max_size 2048; |
server_tokens | 控制Nginx版本号显示或隐藏 | on 或off |
server_tokens off; |
3.4 server块
server块的常见配置整理如下:
配置指令 | 作用 | 取值 | 示例 |
---|---|---|---|
listen | 监听端口 | IP地址:端口、端口 | listen 80; 或 listen 127.0.0.1:8080; |
server_name | 定义虚拟主机的域名 | 域名或通配符 | server_name example.com; |
root | 网站根目录 | 目录路径 | root /var/www/html; |
index | 默认首页文件 | 文件名或文件列表 | index index.html; |
location | 匹配请求的URL路径 | 路径或正则表达式 | location / { ... } |
access_log | 访问日志文件路径 | 文件路径 | access_log /var/log/nginx/access.log; |
error_page | 定义错误页面 | HTTP状态码 页面路径 | error_page 404 /404.html; |
ssl_certificate | SSL证书文件路径 | 文件路径 | ssl_certificate /etc/nginx/ssl/cert.pem; |
ssl_certificate_key | SSL私钥文件路径 | 文件路径 | ssl_certificate_key /etc/nginx/ssl/key.pem; |
ssl_protocols | 定义SSL/TLS协议版本 | 协议版本列表 | ssl_protocols TLSv1.2 TLSv1.3; |
ssl_ciphers | 定义SSL加密算法 | 加密算法列表 | ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM'; |
3.5 location块
location块的常见配置整理如下:
配置指令 | 作用 | 取值 | 示例 |
---|---|---|---|
location | 匹配请求的URL路径 | 路径或正则表达式 | location / { ... } |
root | 指定当前location 块的根目录 |
目录路径 | root /var/www/html; |
index | 指定当前location 块的默认首页文件 |
文件名或文件列表 | index index.html; |
try_files | 尝试不同的文件或路径来匹配请求 | 文件或路径列表 | try_files $uri $uri/ /index.html; |
rewrite | 重写URL | 重写规则 | rewrite ^/old-url$ /new-url permanent; |
proxy_pass | 反向代理到后端服务器 | 后端服务器地址 | proxy_pass http://localhost:8080; |
fastcgi_pass | 将请求传递给FastCGI服务器 | FastCGI地址 | fastcgi_pass unix:/var/run/php-fpm.sock; |
deny | 拒绝访问 | IP地址、主机名、all | deny 192.168.1.1; |
allow | 允许访问 | IP地址、主机名、all | allow 192.168.1.0/24; |
expires | 设置缓存过期时间 | 时间值 | expires 1h; |
在Nginx的location
块中,可以使用正则表达式来匹配复杂的URL路径模式。以下是一些常用的正则表达式及其示例:
-
匹配以特定字符开头的URL路径:
- 正则表达式:
^/admin/.*
- 示例:
location ~ ^/admin/.* { ... }
- 描述:匹配以
/admin/
开头的所有URL路径,如/admin/dashboard
、/admin/settings
等。
- 正则表达式:
-
匹配特定文件扩展名的URL路径:
- 正则表达式:
\.html$
- 示例:
location ~ \.html$ { ... }
- 描述:匹配以
.html
结尾的URL路径,如/page.html
、/about.html
等。
- 正则表达式:
-
匹配数字作为URL路径一部分:
- 正则表达式:
/[0-9]+
- 示例:
location ~ /[0-9]+ { ... }
- 描述:匹配包含数字的URL路径部分,如
/post/123
,/user/456
等。
- 正则表达式:
-
匹配多种可能性的URL路径:
- 正则表达式:
/(news|blog)/[0-9]+
- 示例:
location ~ /(news|blog)/[0-9]+ { ... }
- 描述:匹配类似
/news/123
,/blog/456
等多种可能性的URL路径。
- 正则表达式:
-
匹配任意字符的URL路径:
- 正则表达式:
.*
- 示例:
location ~ .* { ... }
- 描述:匹配任意字符的URL路径。
- 正则表达式:
4、测试
4.1 设置默认界面
编写一个简单的HTML界面作为首页,代码如下,命令为mynginx.html。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>my nginx</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
}
form {
margin-top: 20px;
}
input {
padding: 5px;
width: 300px;
}
button {
padding: 5px 10px;
background-color: #3385ff;
color: white;
border: none;
cursor: pointer;
}
</style>
</head>
<body>
<div>
<form id="search-form">
<input type="text" id="search-input" placeholder="请输入搜索内容">
<button type="submit">搜索</button>
</form>
</div>
</body>
</html>
修改配置文件如下,并将上述HTML文件放置在/home/orangepi/Nginx目录下。
events{}
http{
server{
listen 80;
server_name localhost;
# 指定根目录
root /home/orangepi/Nginx;
# 指定默认网页
index mynginx.html;
}
}
使用nginx -s reload命令重新加载后进行访问测试:
4.2 编写服务器测试程序
编写服务器测试程序代码如下,通过命令行指定监听的端口:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define MAX_SIZE 1024
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Usage: %s <port>\n", argv[0]);
return 1;
}
int PORT = atoi(argv[1]);
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
const char *ok = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<html><body><h1>OK</h1></body></html>";
// 创建TCP套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定套接字到指定端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听端口
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d\n", PORT);
while(1)
{
printf("Waiting......\n");
// 接受连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0)
{
perror("accept failed");
exit(EXIT_FAILURE);
}
char rcvbuffer[MAX_SIZE] = {0};
bzero((char *)rcvbuffer, sizeof(rcvbuffer));
int bytesReceived = read(new_socket, rcvbuffer, MAX_SIZE);
send(new_socket, ok, strlen(ok), 0);
printf("Connect Ok\n");
usleep(1000);
close(new_socket);
}
close(server_fd);
return 0;
}
4.3 测试负载均衡
修改配置文件如下:
events{}
http{
upstream my-servers{
server localhost:8080 weight=3;
server localhost:8081 weight=1;
}
server{
listen 80;
server_name localhost;
# 指定根目录
root /home/orangepi/Nginx;
# 指定默认网页
index index.html;
location / {
# 反向代理到后端服务器
proxy_pass http://my-servers;
}
}
}
发起服务器程序,同时在浏览器侧一直访问进行测试:
5、总结
本文讲解了Nginx的特点,详细讲解了配置文件的格式和配置语法,编写测试程序测试了设置默认界面以及负载均衡调节等功能。