Web 基础——Nginx(一)

简介: Nginx 是一款开源的高性能 HTTP 服务器和反向代理服务器,同时支持 IMAP/POP3/SMTP 代理服务,其性能优势着为显著,官网上称:单台 Nginx 服务器可以处理 50000 并发。

Web 基础——Nginx(一)



一、Nginx 简介


1.Nginx 应用场景

2.Nginx 高并发原理

3.CPU 亲和


二、部署 Nginx 网站服务


1.编译安装 Nginx

2.安装后优化调整

3.编写 Nginx 的启动脚本


三、Nginx 优化


1.配置 CPU 亲和

2.Nginx 常见问题

1)Server 优先级

2)Location 优先级

3)Try_Files 的使用

4)Alias 与 Root 区别

3.获取用户真实 IP


一、Nginx 简介



Nginx 是一款开源的高性能 HTTP 服务器和反向代理服务器,同时支持 IMAP/POP3/SMTP 代理服务,其性能优势着为显著,官网上称:单台 Nginx 服务器可以处理 50000 并发。


  • 特点:高性能、稳定、消耗硬件资源小、能够处理大并发,主要用于静态的解析,动静页面的分离。


1.Nginx 应用场景


  • 静态处理:对静态页面的处理,不管是 Apache 还是 Nginx 默认只能处理静态页面。
  • 反向代理:不直接处理客户端请求,而是将请求转交给其它服务器。
  • 负载均衡:需要跟反向代理相结合,负责将客户端的请求转交给其它压力较小的服务器。
  • 资源缓存:对客户端经常访问的数据进行缓存,从而加快客户端的访问速度。
  • 安全防护:Nginx 对自己本身有一定的防护措施。
  • 访问限制:有点类似于 Apache 的 Order deny,allow。
  • 访问认证:对所访问网站,进行添加用户名和密码。


2.Nginx 高并发原理


  • Nginx 高并发使用的是 epoll 的方式,提供给用户访问,复制数据的一些操作交由内核完成;
  • 自身做的事情越少接待的用户请求就越多。
  • epoll 在 Linux 2.6 中增加了内存拷贝 mmap 机制,加速与内核空间的消息传递,即内存映射。


  • 内存映射机制:硬盘中有数据,数据有对应的 inode,在内存中映射一个相同的 inode,大小也相同,下次拿数据不需要遍历 inode,分析路径了。这样提高了效率。


3.CPU 亲和


  • 将 CPU 核心和 Nginx 工作进程绑定,把每个 Worker 进程固定在一个 CPU 上执行,减少切换 CPU 的 cache miss,获得更好的性能。


image.png


二、部署 Nginx 网站服务



准备工作


image.png


1.编译安装 Nginx



[root@Nginx ~]# wget http://www.nginx.org/download/nginx-1.18.0.tar.gz
[root@Nginx ~]# yum -y install pcre-devel zlib-devel
[root@Nginx ~]# ls
anaconda-ks.cfg  nginx-1.18.0.tar.gz
[root@Nginx ~]# tar zxf nginx-1.18.0.tar.gz -C /usr/src/
[root@Nginx ~]# cd /usr/src/nginx-1.18.0/
[root@Nginx nginx-1.18.0]# useradd -M -s /sbin/nologin nginx
[root@Nginx nginx-1.18.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install


image.png


2.安装后优化调整


[root@Nginx nginx-1.18.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/         #创建软链接优化执行路径
[root@Nginx nginx-1.18.0]# cd
[root@Nginx ~]# nginx -v                                    #查看版本
[root@Nginx ~]# nginx                                     #启动Nginx
[root@Nginx ~]# netstat -anpt | grep nginx                            #查看网络连接状态


image.png


3.编写 Nginx 的启动脚本


[root@Nginx ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@Nginx ~]# nginx -s stop
[root@Nginx ~]# netstat -anpt | grep 80
[root@Nginx ~]# systemctl start nginx 
[root@Nginx ~]# netstat -anpt | grep 80


image.png


三、Nginx 优化



1.配置 CPU 亲和


  • 配置 CPU 亲和能够减少进程之间不断频繁迁移,减少性能损耗。


1)查看当前 CPU 物理状态


[root@Nginx ~]# lscpu | grep "CPU(s)"


2)将 Nginx Worker 进程绑到不同的核心上


  • 指定 CPU 核心来进行绑定:


worker_processes 6;
worker_cpu_affinity 000001 000010 000100 001000 010000 100000;


  • 最佳绑定方式:


worker_processes auto;
worker_cpu_affinity auto;


3)查看 Nginx Worker 进程绑定至对应 CPU


[root@Nginx ~]# ps -eo pid,args,psr | grep [n]ginx


2.Nginx 常见问题


1)Server 优先级


[root@Nginx ~]# mkdir -p /zhangsan/Coco{1..3}
[root@Nginx ~]# for A in {1..3};do echo "<h1>Coco $A</h1>" > /zhangsan/Coco"$A"/index.html;done
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.1.1;
        location / {
            root   /zhangsan/Coco1;
            index  index.html;
        }
    }
    server {
        listen       80;
        server_name  192.168.1.1;
        location / {
            root   /zhangsan/Coco2;
            index  index.html;
        }
    }
    server {
        listen       80;
        server_name  192.168.1.1;
        location / {
            root   /zhangsan/Coco3;
            index  index.html;
        }
    }
}
[root@Nginx ~]# nginx -t                  #检查配置文件是否正确
[root@Nginx ~]# systemctl restart nginx           #重启Nginx服务
[root@Nginx ~]# curl http://192.168.1.1


  • 注意:当多个 server_name 一样时,访问的优先级是从上到下。


2)Location 优先级


一个 Server 出现多个 location


image.png


  • 优先级为:= ^~ ~ ~*


[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.1.1;
        root /zhangsan;
        index index.html;
        location = /Coco1/ {
        rewrite ^(.*)$ /Coco1/index.html break;
        }
        location ~ /Coco* {
        rewrite ^(.*)$ /Coco3/index.html break;
        }
        location ^~ /Coco {
        rewrite ^(.*)$ /Coco2/index.html break;
        }
    }
}
[root@Nginx ~]# systemctl restart nginx
[root@Nginx ~]# curl http://192.168.1.1/Coco1/
<h1>Coco 1</h1>
[root@Nginx ~]# curl http://192.168.1.1/Cocooo
<h1>Coco 2</h1>
[root@Nginx ~]# curl http://192.168.1.1/Coc
<h1>Coco 3</h1>


  • 注意:完全匹配是必须要完全一样才可以,使用前缀匹配是只要前面一样即可。


3)Try_Files 的使用


  • Nginx 的 Try_Files 能够按顺序检查文件是否存在。


[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.1.1;
        root /zhangsan;
        index index.html;
        location / {
        try_files $uri $uri/ /Coco3/index.html;
        }
    }
}
[root@Nginx ~]# systemctl restart nginx
[root@Nginx ~]# curl http://192.168.1.1/Coco1/
<h1>Coco 1</h1>
[root@Nginx ~]# curl http://192.168.1.1/Docker/
<h1>Coco 3</h1>


执行过程:


  1. 首先会检查用户请求的 uri 内容是否存在本地,存在则解析;
  2. 如果不存在的话就会根据 /Coco3/index.html 指定路径来解析。


4)Alias 与 Root 区别


Root 路径配置:


[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.1.1;
        location /Coco1 {
        root /zhangsan;
        index index.html;
        }
    }
}
[root@Nginx ~]# systemctl restart nginx
[root@Nginx ~]# curl http://192.168.1.1/Coco1/
<h1>Coco 1</h1>


  • 实际请求本地路径为:root路径 + location路径 也就是 /zhangsan/Coco1/


Alias 路径配置:


[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.1.1;
        location /Docker {
        alias /zhangsan/Coco1;
        index index.html;
        }
    }
}
[root@Nginx ~]# systemctl restart nginx
[root@Nginx ~]# curl http://192.168.1.1/Docker/
<h1>Coco 1</h1>


  • 注意:当配置完 alias 路径时,它会把原有的 location 路径代替,但是只能使用 location 配置的路径来访问。


总结:root 是用来设置根目录的,而 alias 是用来重置当前文件的目录(也就是 location /目录)


3.获取用户真实 IP


添加一台机器名为 BeiDaiLi 并安装 Nginx,IP地址为:192.168.1.2


[root@BeiDaiLi ~]# vim /usr/local/nginx/conf/nginx.conf
21     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
22                       '$status $body_bytes_sent "$http_referer" '
23                       '"$http_user_agent" "$http_x_forwarded_for"';
24 
25     access_log  logs/access.log  main;
[root@BeiDaiLi ~]# echo "<h1>192.168.1.2</h1>" > /usr/local/nginx/html/index.html
[root@BeiDaiLi ~]# systemctl restart nginx


配置 Nginx 主机


[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.1.1;
        location / {
        root html;
        index index.html;
        proxy_pass http://192.168.1.2;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
[root@Nginx ~]# echo "<h1>192.168.1.1</h1>" > /usr/local/nginx/html/index.html
[root@Nginx ~]# systemctl restart nginx


访问 http://192.168.1.1 验证:


image.png


查看日志:


 
         


image.png

相关文章
|
3月前
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
117 0
|
1月前
|
应用服务中间件 网络安全 nginx
nginx作为web服务以及nginx.conf详解
nginx作为web服务以及nginx.conf详解
|
2月前
|
负载均衡 网络协议 应用服务中间件
web群集--rocky9.2源码部署nginx1.24的详细过程
Nginx 是一款由 Igor Sysoev 开发的开源高性能 HTTP 服务器和反向代理服务器,自 2004 年发布以来,以其高效、稳定和灵活的特点迅速成为许多网站和应用的首选。本文详细介绍了 Nginx 的核心概念、工作原理及常见使用场景,涵盖高并发处理、反向代理、负载均衡、低内存占用等特点,并提供了安装配置教程,适合开发者参考学习。
|
3月前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
3月前
|
负载均衡 应用服务中间件 Apache
Nginx与Apache的终极对决:揭秘Web服务器界的“速度与激情”!你不可不知的性能霸主如何颠覆传统,震撼互联网的根基!
【8月更文挑战第13天】互联网技术发展中,Web服务器至关重要,Nginx与Apache是最广泛使用的两种。Apache历史悠久,但Nginx以轻量级和高性能脱颖而出。Nginx采用事件驱动架构,高效处理大量并发连接,而Apache使用进程驱动,高并发下资源消耗大。以餐厅为例,Nginx像大堂经理同时处理多个顾客需求,远比Apache为每位顾客分配服务员更高效。性能测试显示Nginx处理能力远超Apache。此外,Nginx配置简洁灵活,尤其在负载均衡方面表现突出。尽管Apache适合动态内容处理,但在快速变化的互联网环境中,Nginx因其独特优势成为许多开发者和企业的首选。
66 7
|
3月前
|
应用服务中间件 Linux 网络安全
在Linux中,如何配置Apache或Nginx Web服务器?
在Linux中,如何配置Apache或Nginx Web服务器?
|
3月前
|
存储 Ubuntu 应用服务中间件
如何在虚拟专用服务器上配置 Nginx Web 服务器
如何在虚拟专用服务器上配置 Nginx Web 服务器
31 0
|
5月前
|
安全 Ubuntu 应用服务中间件
NGINX环境下实现Web网站访问控制的实战指南
在NGINX中设置基于IP的访问控制可提升网站安全性。步骤包括安装NGINX、备份配置文件、编辑`/etc/nginx/sites-available/default`,添加`allow`和`deny`指令限制特定IP访问,如`allow 192.168.1.100; deny all;`,然后测试配置并重启服务。成功后,仅允许的IP能访问网站,否则会收到403错误。这为Web安全提供基础保障,还可扩展实现更多高级控制策略。【6月更文挑战第20天】
616 3
|
5月前
|
Java Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之Web函数启动的Spring Boot项目可以通过什么方式配置Nginx
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
5月前
|
缓存 负载均衡 应用服务中间件
Nginx 是一个高性能的开源反向代理服务器和 Web 服务器
Nginx 是一个高性能的开源反向代理服务器和 Web 服务器
75 0
下一篇
无影云桌面