nginx简介
nginx是一个web服务器,知名的衍生版还有:OpenResty,tengine
Centos7安装openresty
也适用于rhel8
参考官方文档:https://openresty.org/cn/linux-packages.html#rhel
# 下载openresty的yum源
curl -o /etc/yum.repos.d/openresty.repo https://openresty.org/package/rhel/openresty.repo
# yum安装openresty
yum install -y openresty
# 将openresty配置文件目录软链接到/etc/nginx
ln -snf /usr/local/openresty/nginx/ /etc/nginx
# 开机自启动并现在启动服务
systemctl enable --now openresty.service
openresty实际上是nginx的软链接
参考:https://tinychen.com/20210317-openresty-01-introduction-and-installation/
nginx常用命令
关闭nginx
# 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s stop
# 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s quit
重新加载nginx配置
# 因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reload
重新打开nginx日志文件
# 重新打开日志文件
nginx -s reopen
指定nginx配置
# 为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename
# 按照指定配置去启动nginx
nginx -c conf/nginx.conf
检查nginx配置语法
# 不运行,仅仅测试配置文件
## 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -t
## 检查指定配置文件的语法正确性
nginx -t -c conf/nginx.conf
检查nginx版本
# 显示 nginx 的版本
nginx -v
# 显示 nginx 的版本,编译器版本和配置参数
nginx -V
查看nginx日志
# 查看nginx日志
tail -f /var/log/nginx/access.log
源码安装nginx
参考: 搞懂Nginx
参考: nginx从安装到高可用
安装编译环境
# 安装编译环境
yum install -y gcc make \
pcre pcre-devel zlib zlib-devel \
openssl openssl-devel && \
yum clean all && \
rm -rf /var/cache/yum/*
创建makefile文件
参数 | 解释 |
---|---|
–prefix | 指定Nginx安装的目录 |
–pid-path | Nginx主进程的PID文件。 |
–lock-path | 指定Nginx互斥锁文件路径。用于防止同时启动多个 Nginx 进程。 |
–error-log-path | 指定Nginx错误日志的保存路径。 |
–http-log-path | 指定Nginx访问日志的保存路径 |
–with-http_gzip_static_module | 该模块允许 Nginx 对静态文件进行 Gzip 压缩,可以节省带宽 |
–with-http_ssl_module | http_ssl_module 用于启用 HTTPS 支持 |
–with-http_stub_status_module | stub_status 模块,可以查看 Nginx 的运行状态信息 |
–with-http_realip_module | |
–with-threads | 开启Nginx的线程支持。线程可以提高 Nginx 处理请求的并发能力。 |
–http-client-body-temp-path | 指定客户端请求 body 临时文件的存放位置。 |
–http-proxy-temp-path | 设定http代理临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
# 编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错
mkdir /var/temp/nginx -p
# 创建makefile文件
cd nginx-1.18.0 && \
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-threads \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
编译安装nginx
# 编译安装nginx
make -j && make install && \
# 创建nginx命令行的软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
# 设置时区为上海
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 启动nginx:
nginx
# 停止:
./nginx -s stop
# 重新加载:
./nginx -s reload
nginx常用工具
vscode配置nginx插件
nginx代码高亮插件:
nginx-formatter
nginx代码格式化插件:
NGINX Configuration
nginx配置语法提示和自动补全插件:
NGINX Configuration Language Support
在线生成nginx配置文件
地址: https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN
nginx可视化配置工具
项目地址:https://github.com/onlyGuo/nginx-gui
nginx常用配置
参考:https://github.com/dunwu/nginx-tutorial
nginx反向代理
参考: https://www.cnblogs.com/ysocean/p/9392908.html#_label4_2
参考: nginx从安装到高可用
1、配置upstream上游
upstream
字段配置负载均衡
# 配置上游服务器集群
## proxyName是上游服务器集群的名称
upstream proxyName {
# 上游服务器1的 IP地址和端口
server 192.168.1.173:8080;
# 上游服务器2的 IP地址和端口
server 192.168.1.174:8080;
# 上游服务器3的 IP地址和端口
server 192.168.1.175:8080;
}
2、配置server
server_name
字段配置虚拟主机
# server - 定义一个虚拟主机
server {
# 监听80端口,接收通过HTTP协议传输的请求。
listem 80;
# 定义域名(www.tomcats.com)对应的虚拟主机。
server_name www.tomcats.com;
# 处理根目录的请求
location / {
# 将请求代理转发给名为tomcats的上游服务器集群
proxy_pass http://tomcats;
}
}
3、配置location匹配不同uri做不同处理和响应
配置参考:https://segmentfault.com/a/1190000022315733
location
的作用:地址定向,数据缓存,应答控制,以及第三方模块的配置。
location
指令用于根据请求的 URI 来匹配不同的处理规则。它可以用来区分不同的静态文件、动态资源、以及不同的后端服务器等。
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
# 转发规则
location / {
# proxy_pass转向地址
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(上游)配置负载均衡
nginx负载均衡
参考: nginx从安装到高可用
nginx默认
采用轮询
的方式进行负载均衡
1、weight(加权轮询)
权重值越大
,请求转发
到该上游服务器比例
就越大
权重值为0
,只有在其他服务器故障
时才会被用于负载均衡。
# 配置上游服务器集群
## proxyName是上游服务器集群的名称
upstream proxyName {
# 上游服务器1的 IP地址和端口,权重为1
server 192.168.1.173:8080 weight=1;
# 上游服务器2的 IP地址和端口,权重为5
server 192.168.1.174:8080 weight=5;
# 上游服务器3的 IP地址和端口,权重为2
server 192.168.1.175:8080 weight=2;
}
2、ip_hash(负载均衡)
ip_hash
策略,该策略会使用客户端IP地址
的哈希值
来选择上游服务器
。
具体来说:当客户端第一次
请求时,nginx会将客户端的IP地址进行哈希计算,然后使用哈希值对上游服务器的数量取模,以确定应该使用哪个上游服务器处理该请求。
如果客户端IP地址不变
,则后续
的请求
都会被转发到同一个上游服务器
。
hash算法实际上只会计算 192.168.1
这段做哈希
。
使用ip_hash的注意点
:
不能把后台服务器直接移除
,只能标记down
.
# 配置上游服务器集群
## proxyName是上游服务器集群的名称
upstream proxyName {
# ip_hash策略
ip_hash
# 上游服务器1的 IP地址和端口
server 192.168.1.173:8080;
# 上游服务器2的 IP地址和端口
server 192.168.1.174:8080;
# 上游服务器3的 IP地址和端口
server 192.168.1.175:8080;
}
3、url hash负载均衡
hash $request_url
:使用请求的 URL
进行哈希
,以便在后续的负载均衡中选择服务器。这里使用的是哈希算法,可以根据不同的负载均衡策略选择不同的算法。
# 定义一个名为 [proxyName] 的 upstream 用于代理请求
upstream proxyName {
# 根据请求的 URL 进行哈希,以便在后续的负载均衡中选择服务器
hash $request_url;
# 定义三个服务器,用于实现负载均衡
# 上游服务器1的 IP地址和端口
server 192.168.1.173:8080;
# 上游服务器2的 IP地址和端口
server 192.168.1.174:8080;
# 上游服务器3的 IP地址和端口
server 192.168.1.175:8080;
}
4、least_conn(最小连接负载均衡)
least_conn
:使用最小连接数
负载均衡策略,即选择连接数最少的服务器进行转发。使用 least_conn 策略可以避免某个服务器负载过高,而其他服务器负载较轻的情况。
# 定义一个名为 [proxyName] 的 upstream 用于代理请求
upstream proxyName {
# 使用 least_conn 策略,即选择连接数最少的服务器进行转发
least_conn;
# 定义三个服务器,用于实现负载均衡
# 上游服务器1的 IP地址和端口
server 192.168.1.173:8080;
# 上游服务器2的 IP地址和端口
server 192.168.1.174:8080;
# 上游服务器3的 IP地址和端口
server 192.168.1.175:8080;
}
nginx配置示例
nginx大师配置模板
# 全局设置
# 指定 Nginx 运行的用户和用户组
user www-data;
# 自动选择工作进程数,通常为 CPU 核心数
worker_processes auto;
# 错误日志文件的位置
error_log /var/log/nginx/error.log;
# 指定 Nginx 进程 ID 文件的位置
pid /run/nginx.pid;
# 加载动态模块配置文件
# 从指定路径加载所有以 '.conf' 结尾的文件
include /usr/share/nginx/modules/*.conf;
# 其他配置文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# 事件配置
events {
# 每个工作进程的最大连接数
worker_connections 1024;
# 允许一个工作进程同时接受多个新连接
multi_accept on;
# 使用 epoll 事件模型(Linux 平台推荐)
use epoll;
}
http {
# 基本设置
# 定义访问日志格式 'main'
# 使用 JSON 格式记录各种请求和响应信息,包括时间戳、客户端 IP、主机名、请求 URL 等
log_format main '{"nginx_timestamp":"$time_iso8601","clientip":"$remote_addr",'
'"nginx_host":"$server_addr","host":"$http_host","request":"$request","url":"$request_uri",'
'"status":"$status","body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time","upstream_response_time":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr","xff":"$http_x_forwarded_for","referer":"$http_referer",'
'"http_user_agent":"$http_user_agent","request_length":"$request_length","request_method":"$request_method"}';
# 启用高效的文件传输模式
sendfile on;
# 减少网络传输中的 TCP 包数量
tcp_nopush on;
# 减少网络传输中的延迟
tcp_nodelay on;
# 保持连接的超时时间
keepalive_timeout 65;
# 设置 MIME 类型哈希表的最大大小
types_hash_max_size 4096;
# 隐藏 Nginx 版本信息
server_tokens off;
# MIME 类型
# 包含 MIME 类型配置文件
include /etc/nginx/mime.types;
# 默认的 MIME 类型
default_type application/octet-stream;
# 日志设置
# 指定访问日志文件路径和使用的日志格式 'main'
access_log /var/log/nginx/access.log main;
# Gzip 压缩
# 启用 Gzip 压缩
gzip on;
# 禁用对 IE6 的 Gzip 压缩
gzip_disable "msie6";
# 启用响应头中的 Vary: Accept-Encoding
gzip_vary on;
# 启用对所有代理请求的 Gzip 压缩
gzip_proxied any;
# 设置 Gzip 压缩级别(1-9)
gzip_comp_level 6;
# 设置 Gzip 缓冲区大小
gzip_buffers 16 8k;
# 启用对 HTTP/1.1 的 Gzip 压缩
gzip_http_version 1.1;
# 指定要压缩的 MIME 类型
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 缓存机制
# 配置缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
# 负载均衡设置
upstream backend {
# 定义后端服务器1,权重为5
server backend1.example.com weight=5;
# 定义后端服务器2
server backend2.example.com;
# 定义后端服务器3,作为备份服务器
server backend3.example.com backup;
}
# 服务器块
server {
# 监听端口 80(HTTP)
listen 80;
# 定义服务器名称
server_name example.com www.example.com;
# 设置网站根目录
root /var/www/html;
# 设置默认索引文件
index index.php index.html index.htm;
# 安全设置
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff";
# 启用 XSS 保护
add_header X-XSS-Protection "1; mode=block";
# 缓存设置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
# 设置缓存过期时间为 30 天
expires 30d;
# 设置缓存控制头部
add_header Cache-Control "public, no-transform";
}
# 动态内容处理(PHP 示例)
location ~ \.php$ {
# 包含 FastCGI 配置文件
include snippets/fastcgi-php.conf;
# 指定 PHP-FPM 进程的 Unix 套接字路径
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# 设置 SCRIPT_FILENAME 参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 包含 FastCGI 参数配置文件
include fastcgi_params;
}
# 反向代理设置
location /api/ {
# 将请求转发给后端服务器池
proxy_pass http://backend;
# 设置 Host 头部
proxy_set_header Host $host;
# 设置 X-Real-IP 头部
proxy_set_header X-Real-IP $remote_addr;
# 设置 X-Forwarded-For 头部
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置 X-Forwarded-Proto 头部
proxy_set_header X-Forwarded-Proto $scheme;
# 启用缓存
proxy_cache my_cache;
# 设置缓存有效期为 10 分钟
proxy_cache_valid 200 302 10m;
# 设置 404 错误的缓存有效期为 1 分钟
proxy_cache_valid 404 1m;
}
# 错误页面
# 自定义 404 错误页面
error_page 404 /404.html;
location = /404.html {
# 仅内部请求可访问
internal;
}
# 自定义 50x 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# 仅内部请求可访问
internal;
}
}
# HTTPS 服务器块(可选)
server {
# 监听端口 443(HTTPS)
listen 443 ssl;
# 定义服务器名称
server_name example.com www.example.com;
# 指定 SSL 证书路径
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
# 指定 SSL 证书密钥路径
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
# 启用 TLS 协议版本
ssl_protocols TLSv1.2 TLSv1.3;
# 优先使用服务器端的密码套件
ssl_prefer_server_ciphers on;
# 指定密码套件
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
# 设置网站根目录
root /var/www/html;
# 设置默认索引文件
index index.php index.html index.htm;
# 安全设置
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff";
# 启用 XSS 保护
add_header X-XSS-Protection "1; mode=block";
# 缓存设置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
# 设置缓存过期时间为 30 天
expires 30d;
# 设置缓存控制头部
add_header Cache-Control "public, no-transform";
}
# 动态内容处理(PHP 示例)
location ~ \.php$ {
# 包含 FastCGI 配置文件
include snippets/fastcgi-php.conf;
# 指定 PHP-FPM 进程的 Unix 套接字路径
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
# 设置 SCRIPT_FILENAME 参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 包含 FastCGI 参数配置文件
include fastcgi_params;
}
# 反向代理设置
location /api/ {
# 将请求转发给后端服务器池
proxy_pass http://backend;
# 设置 Host 头部
proxy_set_header Host $host;
# 设置 X-Real-IP 头部
proxy_set_header X-Real-IP $remote_addr;
# 设置 X-Forwarded-For 头部
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置 X-Forwarded-Proto 头部
proxy_set_header X-Forwarded-Proto $scheme;
# 启用缓存
proxy_cache my_cache;
# 设置缓存有效期为 10 分钟
proxy_cache_valid 200 302 10m;
# 设置 404 错误的缓存有效期为 1 分钟
proxy_cache_valid 404 1m;
}
# 错误页面
# 自定义 404 错误页面
error_page 404 /404.html;
location = /404.html {
# 仅内部请求可访问
internal;
}
}
}
生产环境示例
server {
# 监听80端口
listen 80;
# 定义服务器名称为 php.1314000.cn
server_name php.1314000.cn;
# 网站根目录
root /data/web8080;
# 访问日志文件路径
access_log /usr/local/ngin/logs/success_php1314000cn.log main;
location / {
# 使用代理后的真实IP进行判断
# if ($http_x_forwarded_for ~* '124\.204\.248\.85') {
# return 403; # 禁止来自这个IP的访问
# }
# 如果请求的文件不存在,重写URL到 index.php,并传递原始路径作为参数
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?s=/$1 last;
break;
}
# 默认访问文件
index index.html index.htm index.php;
}
location /tk {
# 允许指定的IP访问该路径
allow 124.204.248.85;
# 禁止所有其他IP访问
deny all;
# 重新定向到百度
# rewrite ^ https://www.baidu.com/ redirect;
# break;
}
location ~ /admin {
# 允许指定IP访问 /admin 路径
allow 124.204.248.85;
# 禁止其他所有IP访问
deny all;
}
location ~ \.php$ {
# 将PHP请求转发到运行在127.0.0.1:9000上的FastCGI处理器
fastcgi_pass 127.0.0.1:9000;
# 定义FastCGI参数,传递实际的PHP脚本路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 包含标准的FastCGI参数配置
include fastcgi_params;
}
}