配置nginx
约 3280 字大约 11 分钟
2024-11-14
nginx控制文件上传大小:在http{} 中加入 client_max_body_size 100m;
0. 直接用版本
后端调用
upstream cloudServer {
server 127.0.0.1:9100;
#server 127.0.0.1:9003 backup; #热备
}
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
#root /var/www/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /nacos {
proxy_pass http://127.0.0.1:10100;
}
# 限制外网访问内网 actuator 相关路径
location ~ ^(/[^/]*)?/actuator(/.*)?$ {
return 403;
}
location /prod-api/ {
# 设置请求头中的Host字段
proxy_set_header Host $host;
# 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置请求头中的X-Real-IP字段,表示客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE_HOST $remote_addr;
proxy_pass http://cloudServer/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
证书配置
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name unravely.cn;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/unravely.cn_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/unravely.cn.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#access_log /var/log/nginx/host.access.log main;
# 处理 immich 请求
location /immich {
proxy_pass http://127.0.0.1:2283;
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;
}
location / {
#root /usr/share/nginx/html;
root /data/vuepress/dist;
index index.html index.htm;
# 缓存时间7天
expires 7d;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name unravely.cn;
# 处理 immich 请求
location /immich {
proxy_pass http://127.0.0.1:2283;
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;
}
# 其他请求重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
开启压缩
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
# 允许一个进程同时接受多个连接
multi_accept on;
# 使用高效的事件模型
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 限制body大小 默认:1M
client_max_body_size 100m;
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;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间。一般设置1和2
gzip_comp_level 5;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
include /etc/nginx/conf.d/*.conf;
}
1. 配置文件结构
- 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- 5、location块:配置请求的路由,以及各种页面的处理情况。
... #全局块
events { #events块
...
}
http { #http块
... #http全局块
upstream myserver { #负载均衡
...
}
server { #server块
... #server全局块
location [PATTERN] { #location块
...
}
location [PATTERN] {
...
}
}
server {
...
}
... #http全局块
}
2. 详细配置
每个指令必须有分号结束
##################### 全局块 ######################
#配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
user nginx; #配置用户或者组
worker_processes auto; #允许生成的进程数,工作进程数量,可配置成服务器内核数 * 2
#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别为:debug|info|notice|warn|error|crit|alert|emerg
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid; #指定nginx进程运行文件存放地址
##################### events块 ######################
#配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
events {
worker_connections 1024; #最大连接数
}
##################### http块 ######################
http {
include /etc/nginx/mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
#日志格式设定
#$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
#$remote_user:用来记录客户端用户名称;
#$time_local: 用来记录访问时间与时区;
#$request: 用来记录请求的url与http协议;
#$status: 用来记录请求状态;成功是200,
#$body_bytes_sent :记录发送给客户端文件主体内容大小;
#$http_referer:用来记录从那个页面链接访问过来的;
#$http_user_agent:记录客户浏览器的相关信息;
#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
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; #访问日志位置
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块
#tcp_nopush on; #此选项允许或禁止使用socke的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
keepalive_timeout 65; #连接保持超时时间,单位是秒
#gzip on; #gzip模块设置,设置是否开启gzip压缩输出
##################### 负载均衡 ######################
upstream myserver {
server 192.168.1.11:8880 weight=5;
server 192.168.1.12:9990 weight=1;
server 192.168.10.121:3333 backup; #热备
}
##################### 虚拟主机,可以配置多个 ######################
server {
listen 80; # ipv4 监听端口
listen [::]:80; # ipv6 监听端口
server_name localhost www.xxxxx.com; #站点域名,可以有多个,用空格隔开
#access_log /var/log/nginx/host.access.log main;
#静态资源配置
location / { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写
root /usr/share/nginx/html; #根目录
index index.html index.htm; #设置默认页
deny 192.168.2.11; #禁止访问的ip地址,可以为all
allow 192.168.3.44; #允许访问的ip地址,可以为all
}
#反向代理配置
location /picx/ {
proxy_pass http://myserver; #请求转向mysvr 定义的服务器列表
#proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
#proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
#proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
#proxy_buffer_size 4k; #代理服务器(nginx)保存用户头信息的缓冲区大小
#proxy_buffers 4 32k; #proxy_buffers缓冲区
#proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
#proxy_temp_file_write_size 64k; #设定缓存文件夹大小
#proxy_set_header Host $host;
#proxy_set_header X-Forwarder-For $remote_addr; #获取客户端真实IP
}
# 重定向配置
location / {
return 404; #直接返回状态码
}
location / {
return 404 "pages not found"; #返回状态码 + 一段文本
}
location / {
return 302 /blog ; #返回状态码 + 重定向地址
}
location / {
return https://www.mingongge.com ; #返回重定向地址
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
3. 域名匹配的四种写法
精确匹配:server_name www.xxxx.com ;
左侧通配:server_name *.xxxx.com ;
右侧统配:server_name www.xxxx.* ;
正则匹配:server_name ~^www\.xxxx\.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
4. location 匹配说明
=
:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。~
:用于表示 uri 包含正则表达式,并且区分大小写。~*
:用于表示 uri 包含正则表达式,并且不区分大小写。^~
:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
5. proxy_pass 匹配说明
访问路径::80/test/insert/a/10
nginx代理:
upstream myserver {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
#server 127.0.0.1:9003 backup; #热备
}
server {
listen 80;
server_name localhost;
location /test {
proxy_pass http://myserver; #请求转向mysvr 定义的服务器列表
proxy_connect_timeout 30; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 30; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 30; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr; #获取客户端真实IP
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://127.0.0.1:10100;
# 设置请求头中的Host字段
proxy_set_header Host $host;
# 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置请求头中的X-Real-IP字段,表示客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE_HOST $remote_addr;
}
location /kibana {
proxy_pass http://127.0.0.1:10500/;
# 设置请求头中的Host字段
proxy_set_header Host $host;
# 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 设置请求头中的X-Real-IP字段,表示客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE_HOST $remote_addr;
}
}
在nginx中配置proxy_pass代理转发时:
- 如果在proxy_pass后面的url中含有/,表示绝对根路径,匹配的location 路径就不在url里了;
- 如果在proxy_pass后面的url中没有/,表示相对路径,把匹配的路径部分也给代理走,要在url里留着。 proxy_pass有/,实际访问地址就没有location
以下是几种常见的匹配情况,访问地址:http://localhost/proxy/abc.html
图示:
序号 | location | proxy_pass | 代理到 |
---|---|---|---|
1 | /proxy/ | http://127.0.0.1:8080/ | http://127.0.0.1:8080/abc.html |
2 | /proxy/ | http://127.0.0.1:8080 | http://127.0.0.1:8080/proxy/abc.html |
3 | /proxy/ | http://127.0.0.1:8080/api/ | http://127.0.0.1:8080/api/abc.html |
4 | /proxy/ | http://127.0.0.1:8080/api | http://127.0.0.1:8080/apiabc.html |
5 | /proxy | http://127.0.0.1:8080/ | http://127.0.0.1:8080//abc.html |
6 | /proxy | http://127.0.0.1:8080 | http://127.0.0.1:8080/proxy/abc.html |
7 | /proxy | http://127.0.0.1:8080/api/ | http://127.0.0.1:8080/proxy//abc.html |
8 | /proxy | http://127.0.0.1:8080/api | http://127.0.0.1:8080/proxy/apiabc.html |
6. nginx负载均衡策略
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2.weight
weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstream server_pool{
server 192.168.5.21 weight=10;
server 192.168.5.22 weight=10;
}
3.ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如
upstream server_pool{
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
4.fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
server 192.168.5.21:80;
server 192.168.5.22:80;
fair;
}
7. 安装 SSL 配置 HTTPS
7.1 下载证书并上传
下载申请好的 ssl 证书文件压缩包到本地并解压(这里是用的 pem 与 key 文件,文件名可以更改)。
在 nginx 目录新建 cert 文件夹存放证书文件。
cd /usr/local/nginx
mkdir cert
将这两个文件上传至服务器的 cert 目录里。
7.2 配置ssl证书
配置 https server。注释掉之前的 http server 配置,新增 https server:
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name www.xxxx.com;
# ssl证书地址
ssl_certificate /usr/local/nginx/cert/ssl.pem; # pem文件的路径
ssl_certificate_key /usr/local/nginx/cert/ssl.key; # key文件的路径
# ssl验证相关配置
ssl_session_timeout 5m; #缓存有效期
ssl_protocols TLSv1.2 TLSv1.3; #安全链接可选的加密协议
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #加密算法 腾讯
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站运行目录在/etc/www下,则填写/etc/www。
root html;
index index.html index.htm;
}
}
将 http 重定向 https。
server {
listen 80;
server_name www.xxxx.com;
return 301 https://$server_name$request_uri;
}