Linux下Nginx详解

打印 上一主题 下一主题

主题 686|帖子 686|积分 2058

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指令将哀求代理到这个后端服务器组。例如:
  1. upstream backend_servers {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4. }
  5. location / {
  6.     proxy_pass http://backend_servers;
  7. }
复制代码
2、Linux部署

2.1 安装

ubuntu安装命令如下:
  1. sudo apt update
  2. 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, reloadnginx -p prefix设置前缀路径(默认值:/usr/share/nginx/)nginx -c filename设置设置文件(默认值:/etc/nginx/nginx.conf)nginx -g directives设置全局指令,超出设置文件之外 3、设置文件详解

3.1 设置文件位置和格式

设置文件一般位于:/etc/nginx/nginx.conf。
其大抵格式如下:
  1. events {
  2.     // 全局事件配置
  3. }
  4. http {
  5.     // 全局HTTP配置
  6.     server {
  7.         // 服务器配置
  8.                     location / {
  9.                         // 路径配置
  10.                 }
  11.     }
  12. }
复制代码
3.2 events块

在events块中,可以设置一些与Nginx服务器的事件相关的参数。
3.2.1 worker_connections



  • 作用:设置每个工作进程允许的最大并发连接数。
  • 取值:整数。默认值取决于系统的最大文件描述符数,通常为1024或更高。
  1. events {
  2.     worker_connections 1024;
  3. }
复制代码
3.2.2 use



  • 作用:指定事件驱动模块,用于处理连接和哀求。
  • 取值:epoll、kqueue、eventport、/dev/poll等,取决于操作系统和Nginx编译时的选项。
  1. events {
  2.     use epoll;
  3. }
复制代码
3.2.3 multi_accept



  • 作用:允许一个工作进程同时接受多个新连接。
  • 取值:on或off。默认为off。
  1. events {
  2.     multi_accept on;
  3. }
复制代码
3.2.4 worker_processes



  • 作用:指定启动的工作进程数。
  • 取值:整数。通常设置为CPU核心数的倍数,以充实利用多核处理器。
  1. events {
  2.     worker_processes 4;
  3. }
复制代码
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或offsendfile on;tcp_nopush启用TCP_NOPUSH选项on或offtcp_nopush on;tcp_nodelay启用TCP_NODELAY选项on或offtcp_nodelay on;keepalive_timeoutKeep-alive连接超时时间整数(秒)keepalive_timeout 65;types_hash_max_sizeMIME类型哈希表最大尺寸整数types_hash_max_size 2048;server_tokens控制Nginx版本号表现或隐蔽on或offserver_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_certificateSSL证书文件路径文件路径ssl_certificate /etc/nginx/ssl/cert.pem;ssl_certificate_keySSL私钥文件路径文件路径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地址、主机名、alldeny 192.168.1.1;allow允许访问IP地址、主机名、allallow 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。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>my nginx</title>
  7.         <style>
  8.     body {
  9.         font-family: Arial, sans-serif;
  10.         text-align: center;
  11.     }
  12.     form {
  13.         margin-top: 20px;
  14.     }
  15.     input {
  16.         padding: 5px;
  17.         width: 300px;
  18.     }
  19.     button {
  20.         padding: 5px 10px;
  21.         background-color: #3385ff;
  22.         color: white;
  23.         border: none;
  24.         cursor: pointer;
  25.     }
  26.         </style>
  27. </head>
  28. <body>
  29.     <div>
  30.     <form id="search-form">
  31.         <input type="text" id="search-input" placeholder="请输入搜索内容">
  32.         <button type="submit">搜索</button>
  33.     </form>
  34.         </div>
  35. </body>
  36. </html>
复制代码
修改设置文件如下,并将上述HTML文件放置在/home/orangepi/Nginx目次下。
  1. events{}
  2. http{
  3.   server{
  4.     listen 80;
  5.     server_name localhost;
  6.        
  7.     # 指定根目录
  8.     root /home/orangepi/Nginx;
  9.        
  10.         # 指定默认网页
  11.     index mynginx.html;
  12.   }
  13. }
复制代码
利用nginx -s reload命令重新加载后进行访问测试:

4.2 编写服务器测试步伐

编写服务器测试步伐代码如下,通过命令行指定监听的端口:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #define MAX_SIZE 1024
  8. int main(int argc, char *argv[])
  9. {
  10.     if (argc != 2)
  11.     {
  12.         fprintf(stderr, "Usage: %s <port>\n", argv[0]);
  13.         return 1;
  14.     }
  15.     int PORT = atoi(argv[1]);
  16.     int server_fd, new_socket;
  17.     struct sockaddr_in address;
  18.     int addrlen = sizeof(address);
  19.    
  20.     const char *ok = "HTTP/1.1 200 OK\r\n"  
  21.                          "Content-Type: text/html; charset=UTF-8\r\n\r\n"  
  22.                          "<html><body><h1>OK</h1></body></html>";
  23.    
  24.     // 创建TCP套接字
  25.     if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  26.         perror("socket failed");
  27.         exit(EXIT_FAILURE);
  28.     }
  29.     address.sin_family = AF_INET;
  30.     address.sin_addr.s_addr = INADDR_ANY;
  31.     address.sin_port = htons(PORT);
  32.     // 绑定套接字到指定端口
  33.     if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
  34.         perror("bind failed");
  35.         exit(EXIT_FAILURE);
  36.     }
  37.     // 监听端口
  38.     if (listen(server_fd, 3) < 0) {
  39.         perror("listen failed");
  40.         exit(EXIT_FAILURE);
  41.     }
  42.     printf("Server listening on port %d\n", PORT);
  43.     while(1)
  44.     {
  45.         printf("Waiting......\n");
  46.         // 接受连接
  47.         if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0)
  48.         {
  49.             perror("accept failed");
  50.             exit(EXIT_FAILURE);
  51.         }
  52.         char rcvbuffer[MAX_SIZE] = {0};
  53.         
  54.         bzero((char *)rcvbuffer, sizeof(rcvbuffer));
  55.         int bytesReceived = read(new_socket, rcvbuffer, MAX_SIZE);
  56.         send(new_socket, ok, strlen(ok), 0);  
  57.         printf("Connect Ok\n");
  58.         usleep(1000);
  59.         
  60.         close(new_socket);
  61.     }
  62.    
  63.     close(server_fd);
  64.     return 0;
  65. }
复制代码
4.3 测试负载均衡

修改设置文件如下:
  1. events{}
  2. http{
  3.   upstream my-servers{
  4.         server localhost:8080 weight=3;
  5.         server localhost:8081 weight=1;
  6.   }
  7.   
  8.   server{
  9.     listen 80;
  10.     server_name localhost;
  11.        
  12.     # 指定根目录
  13.     root /home/orangepi/Nginx;
  14.        
  15.         # 指定默认网页
  16.     index index.html;
  17.        
  18.         location / {
  19.                 # 反向代理到后端服务器
  20.                 proxy_pass http://my-servers;
  21.         }
  22.   }
  23. }
复制代码
发起服务器步伐,同时在浏览器侧一直访问进行测试:

5、总结

本文讲解了Nginx的特点,具体讲解了设置文件的格式和设置语法,编写测试步伐测试了设置默认界面以及负载均衡调节等功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表