欢迎你来读这篇博客,这篇博客主要是关于Nginx 使用简明指南
。
其中包括了关于我的见解和收集的知识分享。
序言
什么是Nginx?
Nginx 是一个高性能的HTTP和反向代理web服务器,核心特点是占有内存少,并发能力强
Nginx能做什么?
- Http服务器(web服务器)
- 性能非常高,非常注重效率,能够经受高负载的考验
- 支持50000个并发连接数,不仅如此,CPU和内存的占用也非常的低,10000个没有活动的连接才占用2.5M的内存。
- 反向代理服务器
- 负载均衡服务器
- 动静分离
Nginx特点
- 跨平台:Nginx可以在大多数类unix操作系统上编译运行,而且也有windows版本
- Nginx的上手非常容易,配置也比较简单
- 高并发,性能好
- 稳定性也特别好,宕机概率很低
正文
安装部署
Docker方式安装
编译安装
- 上传nginx安装包到linux服务器,nginx安装包(.tar文件)下载地址:http://nginx.org
- 安装Nginx依赖,pcre、openssl、gcc、zlib(推荐使用yum源自动安装)
- yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
- 解包Nginx软件包
- tar -xvf nginx-release.tar
- cd进入解压之后的目录 nginx-release
- ./config
- make
- make install 完毕之后在/usr/local/下会产生一个nginx目录
- cd nginx/sbin
- ./nginx
- 访问80端口(nginx默认监听80)
核心配置
nginx核心配置文件 conf/nginx.conf
包含三块内容:全局块、events块、http块。
- 全局块
- 从配置文件开始到events块之间的内容,此处的配置影响nginx服务器整体的运行,比如worker进程的数量、错误日志的位置等
- events块
- events块主要影响nginx服务器与用户的网络连接,比如worker_connections 1024,标识每个workderprocess支持的最大连接数为1024
- http块
- http块是配置最频繁的部分,虚拟主机的配置,监听端口的配置,请求转发、反向代理、负载均衡
配置文件示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| # Nginx 主配置文件 # 全局块 user nginx; # 运行 Nginx 的用户 worker_processes auto; # 自动根据 CPU 核数决定 worker 进程数 worker_cpu_affinity auto; # worker 进程绑定 CPU 核心 worker_rlimit_nofile 10240; # 限制每个 worker 进程打开文件的最大数目 pid /var/run/nginx.pid; # 存放 PID 的文件路径 include /etc/nginx/modules-enabled/*.conf; # 引入动态模块
# events块 # Nginx 工作进程和事件处理 events { worker_connections 1024; # 每个 worker 进程允许的最大连接数 use epoll; # 使用 epoll 模型(适用于 Linux) multi_accept on; # 一个 worker 是否可以同时接受多个连接 }
# HTTP 配置块 http { 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; # 设置访问日志路径和格式 error_log /var/log/nginx/error.log warn; # 设置错误日志路径和日志级别
sendfile on; # 启用 sendfile(文件传输优化) tcp_nopush on; # 启用 TCP_NOPUSH tcp_nodelay on; # 启用 TCP_NODELAY keepalive_timeout 65; # 设置连接的保持时间 types_hash_max_size 2048; # 设置 types_hash 的最大大小 server_tokens off; # 禁用服务器信息暴露 client_max_body_size 10M; # 设置请求体最大尺寸 client_body_timeout 12; # 设置请求体读取超时时间 client_header_timeout 12; # 设置请求头读取超时时间 server_names_hash_bucket_size 64; # 配置虚拟主机名称哈希表的大小 reset_timedout_connection on; # 重置超时连接
include /etc/nginx/mime.types; # 设置 MIME 类型的映射 default_type application/octet-stream; # 默认 MIME 类型
# Gzip 压缩配置 gzip on; gzip_disable "msie6"; # 禁用对 IE6 的 Gzip 支持 gzip_vary on; # 支持 Gzip 缓存 gzip_proxied any; # 启用压缩处理所有代理请求 gzip_comp_level 6; # 设置压缩等级 gzip_types text/plain text/css application/javascript application/json application/xml application/xml+rss text/javascript; # 启用的压缩 MIME 类型
# 设置虚拟主机 server { listen 80 default_server; # 设置监听端口 server_name _; # 默认服务器名称
location / { root /usr/share/nginx/html; # 设置网站根目录 index index.html index.htm; # 设置默认主页 }
# 错误页面处理 error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }
# 文件上传限制 client_max_body_size 10M; }
# 另一虚拟主机示例 server { listen 80; server_name example.com;
location / { root /var/www/example; index index.html index.htm; }
# 反向代理示例 location /api/ { proxy_pass http://backend_server; # 反向代理到后端服务器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
# 动态模块配置 include /etc/nginx/conf.d/*.conf; # 包含所有额外配置 }
|
应用场景
动静分离
动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上,比较经典的组合就是Nginx+Tomcat架构(
Nginx处理静态资源请求,Tomcat处理动态资源请求),Nginx反向代理目标服务器Tomcat,我们能看到目标服务器ROOT项目的index.jsp,这本身就是Tomcat在处理动态资源请求了。
动静分离需求:主要是静态资源的访问,因为我们之前Nginx反向代理到Tomcat能够看到Tomcat
ROOT项目的index.jsp页面这本身就是一个动态资源的请求过程。我们希望在Nginx服务器上部署静态资源,然后浏览器请求http:
//111.229.248.243:9003/static/abc.htm,Nginx直接读取的本地静态资源
通过动静分离,Nginx 将静态资源的请求直接通过 Nginx 自身处理,而将动态请求转发到后端的应用服务器。这样可以减少后端应用服务器的压力,提高处理效率,特别是在高并发情况下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| # nginx 动静分离示例 server { listen 80; server_name example.com;
# 配置静态资源的处理 所有以 /static/* 开头的请求,都走以下配置,去资源目录里面找,让nginx负责处理 location /static/ { root /var/www/html; # 指定静态资源的根目录 expires 30d; # 设置静态文件缓存30天 add_header Cache-Control public; # 使浏览器缓存静态文件 }
# 配置 PHP 动态请求的处理 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # PHP-FPM 服务器地址(假设 PHP-FPM 在本机 9000 端口运行) fastcgi_index index.php; # 默认文件是 index.php fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; # PHP 脚本路径 include fastcgi_params; # 包含 FastCGI 参数配置 }
# 配置其他动态请求,转发给后端应用服务器 location / { proxy_pass http://backend_app_server; # 将动态请求转发到后端应用服务器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
# 配置日志文件 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; }
|
缓存
nginx开启缓存示例配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| http { # 配置缓存路径 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
server { listen 80; server_name example.com;
# 配置代理缓存 location / { proxy_cache my_cache; # 使用名为 my_cache 的缓存区 proxy_cache_valid 200 1h; # 缓存 200 状态码的响应 1 小时 proxy_cache_valid 404 1m; # 缓存 404 状态码的响应 1 分钟 proxy_cache_use_stale error timeout; # 在后端服务器出现错误或超时时,使用过期的缓存 proxy_pass http://backend_app_server; # 将请求转发到后端应用服务器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
# 其他配置... } }
|
清除缓存方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| http { # 清理缓存 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g; server { listen 80; server_name example.com;
# 配置缓存清理 location /clear_cache { # 清理缓存的逻辑,可以通过 Nginx 内部脚本或与缓存管理系统结合。 # 可以写脚本去清理path下面的内容 rm -rf /var/cache/nginx/* } } }
|
反向代理
反向代理是一种服务器架构,其中代理服务器代表客户端向目标服务器发起请求。与传统的正向代理不同,正向代理是客户端通过代理服务器访问互联网,而反向代理则是客户端直接与反向代理服务器交互,代理服务器再将请求转发到实际的后端服务器,最终将后端服务器的响应返回给客户端。
- 正向代理:客户端请求通过代理服务器发送,代理服务器代替客户端向目标服务器发起请求。常见于客户端无法直接访问目标服务器时(如在防火墙后面访问互联网)。
- 反向代理:客户端请求通过代理服务器发送,代理服务器代替目标服务器接收请求并返回响应。客户端通常不需要知道反向代理的存在。
反向代理的主要作用
- 负载均衡:反向代理可以根据不同的算法(如轮询、最少连接等)将客户端的请求分发到多个后端服务器。这种做法可以有效地平衡负载,提升系统的整体性能和可靠性。
- 增强安全性:反向代理可以隐藏真实的后端服务器IP,防止客户端直接访问后端服务器,从而减少攻击的风险。例如,反向代理服务器可以防止外部用户直接与后端服务器的内部网络进行通信。
- 缓存:反向代理可以缓存来自后端服务器的响应内容,特别是静态资源(如图片、JS、CSS
文件等)。当相同请求再次到来时,代理服务器可以直接返回缓存的内容,减少对后端服务器的负载并提升响应速度。
- ssl加速:反向代理可以处理 SSL 加密/解密工作,将这一计算密集型任务从后端服务器中解脱出来,减轻后端服务器的压力,提升性能。
- 请求过滤:反向代理可以用于对客户端的请求进行过滤或处理,例如检查请求是否合法,阻止恶意请求,或者对请求进行认证等。
nginx 反向代理 tomcat 示例配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| http { upstream tomcat_backend { # 定义 Tomcat 后端服务器,支持多个 Tomcat 实例 server 127.0.0.1:8080; # Tomcat 实例1 # server 192.168.1.2:8080; # 可以添加更多 Tomcat 实例进行负载均衡 }
server { listen 80; # 监听80端口 用户访问80
server_name example.com; # 服务器域名
location / { proxy_pass http://tomcat_backend; # 将请求代理到上面定义的 Tomcat 后端服务器 proxy_set_header Host $host; # 保持原始的 Host 头信息 proxy_set_header X-Real-IP $remote_addr; # 传递客户端的 IP 地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留客户端真实 IP proxy_set_header X-Forwarded-Proto $scheme; # 保留协议(http/https) proxy_set_header X-Forwarded-Port $server_port; # 传递端口信息 proxy_set_header X-Forwarded-Host $host; # 保持原始的 Host 信息 proxy_set_header X-Forwarded-Server $host; # 传递代理服务器的主机名 }
error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
|
负载均衡
Nginx负载均衡策略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| # 轮询示例 http { upstream backend { # 默认使用轮询算法 server backend1.example.com; server backend2.example.com; server backend3.example.com; }
server { listen 80;
server_name example.com;
location / { # 将请求转发到 upstream 中定义的服务器 proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
# 常见配置 upstream backend { server backend1.example.com max_fails=3 fail_timeout=30s; server backend2.example.com; server backend3.example.com; }
# 权重方式 upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=1; server backend3.example.com weight=2; }
# iphash upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; }
# 最少连接 upstream backend { least_conn; server backend1.example.com; server backend2.example.com; server backend3.example.com; }
|
参考资料
启示录
富贵岂由人,时会高志须酬。
能成功于千载者,必以近察远。