Nginx 常用安装配置与问题解析
Posted Kelin.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 常用安装配置与问题解析相关的知识,希望对你有一定的参考价值。
nginx 常用配置问题整合
前言
系统环境:Centos8.0+
Nginx 版本:1.20 (本篇文章无新特性,理论支持所有版本,可自行测试)
安装
以Centos8.0+ 为例,可直接使用dnf -y install nginx
安装nginx 服务。
默认使用systemctl
命令管理nginx 服务打开关闭。
官网也提供了很多的方式进行安装,如windows 系统可直接下载后执行,linux 类系统可能需要执行make
命令进行安装,具体安装方式可自行查阅。
----官网下载地址
命令列表:
systemctl 为Centos 系统中的服务管理工具,其他系统另行处理
指定配置文件启动:nginx -c /**/nginx.conf
服务启动:systemctl start nginx
或nginx
服务重启:systemctl restart nginx
或nginx -s reload
配置检查:nginx -t
服务停止:systemctl stop nginx
或直接使用ps
命令查找进程pid
然后kill
掉。
配置server
配置一览
# 负载均衡
upstream my-service {
server 127.0.0.1:12000;
server 127.0.0.1:13000;
}
# http 配置
server
{
# 监听端口号
listen 80;
# 监听域名
server_name domain.com domain2.com;
# 字节编码
charset utf-8;
# 日志输出
access_log /var/log/nginx_access.log;
# 意为request body 中的最大数据量可以传输多少
# 如果超过此大小会直接驳回请求返回错误代码
client_max_body_size 100M;
# gzip 配置
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
# 声明我要开启gzip 的资源请求,这边配置了js 文件与 css 文件的gzip 压缩
gzip_types application/javascript text/css;
gzip_disable "MSIE [1-6]\\.";
gzip_vary on;
# 配置local 信息
location /
{
add_header Cache-Control no-store;
try_files $uri $uri/ /index.html;
root /home/www/;
index index.html;
}
# 配置后端api 转发
location /api
{
proxy_pass http://my-service/api;
proxy_set_header X-Address $remote_addr;
proxy_set_header Host $http_host;
}
# websocket 配置
location /so
{
proxy_pass http://127.0.0.1:15000/so;
proxy_read_timeout 4h;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态资源映射
location ^~ /resource/
{
alias /data/resource/;
autoindex on;
}
}
# https 配置
server
{
listen 443 ssl;
server_name domain.com domain2.com;
charset utf-8;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css;
gzip_disable "MSIE [1-6]\\.";
gzip_vary on;
ssl_certificate /**/server.crt;
ssl_certificate_key /**/server.key;
location /api
{
proxy_pass http://my-service/api;
}
}
负载均衡
upstream my-service {
server 127.0.0.1:12000;
server 127.0.0.1:13000;
}
该配置意为配置两个服务,然后通过轮询的方式进行负载均衡转发访问。
对于upstream
命令,还有一下几种模式
- 轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。upstream my-service { server 127.0.0.1:12000; server 127.0.0.1:13000; }
- 权重
增加权重意指代访问的服务权重比,权重值高转发的次数就会越多upstream my-service { server 127.0.0.1:12000 weight=1; server 127.0.0.1:13000 weight=2; }
- ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。upstream my-service { ip_hash; server 127.0.0.1:12000; server 127.0.0.1:13000; }
- fair
转发的每个请求会按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个请求会固定访问一个后端服务,可以解决session一致性的问题。upstream my-service { server 127.0.0.1:12000; server 127.0.0.1:13000; fair; }
- url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。upstream my-service { server 127.0.0.1:12000; server 127.0.0.1:13000; hash $request_uri; hash_method crc32; }
其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。
server 配置
大部分来讲server 配置中必需包含以下几种配置
server
{
# 监听端口号
listen 80;
# 监听域名
server_name domain.com domain2.com;
location /
{
[other config]
}
}
对于一个server
来讲,重要的就是listen
和server_name
参数,他们标注了此部分配置监听的端口号与监听的域名。
不同的
server
支持监听同一端口不同域名,当有请求访问访问他们相同端口的时候,则会根据域名来区分匹配的server
配置进行转发。
server_name
是可以配置多个的,中间用空格隔开
location 配置
vue 等单页面路由项目配置
# 配置local 信息
location /
{
add_header Cache-Control no-store;
try_files $uri $uri/ /index.html;
root /home/www/;
index index.html;
}
add_header *** ***
:命令的主要作用是为此次request 添加一个指定head 信息。
Cache-Control
为Http 协议中的head,意指此次请求是否缓存,no-store
为不缓存请求内容。try_files
:这不是一个很好理解的命令,意图在于省略rewrite
指令来指定此次请求所访问的一个地址。- 比如此次请求的地址为
http://domain.com/res?userId=1
$uri
指令则代表访问的路径为/res
$request_uri
指令则代表访问的路径为/res?userId=1
- 比如此次请求的地址为
当我使用这样的配置时,访问http://domain.com 时,就可以跳转到
/home/www/index.html
文件下,浏览器会加载index.html
文件中的js 与css 文件,当路由模式为history 或hash 模式时,具体的路由跳转和逻辑处理,都会交给网站的vue router
去管理,所以就可以实现单路由页面跳转,如果没有try_files
的命令,nginx 会将请求完成的转发至root
命令所配置的文件目录下。即当访问的路径为
http://domain.com/user/index.html
时,
则会转发到/home/www/user/index.html
文件下,将该文件返回。
后端服务接口转发
# 配置后端api 转发
location /api
{
proxy_pass http://my-service/api;
proxy_set_header X-Address $remote_addr;
proxy_set_header Host $http_host;
}
该配置意为配置以/api
开头的请求,通过定义的负载均衡my-service
进行转发请求。
如果不需要使用负载均衡,也可以直接配置为http://127.0.0.1:12000/api
。
proxy_set_header
:指令意在设置一个自定义的请求头,X-Address
则是自定义的请求头,将会添加到此次转发的header
中,$remote_addr
是指获取上一级代理的IP,如有其他获取ip 的要求可以自行百度处理。
WebSocket 转发
# websocket 配置
location /so
{
proxy_pass http://127.0.0.1:15000/so;
proxy_read_timeout 4h;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
简单的说一下比较重点的配置
proxy_read_timeout
:配置此次请求链接的时间,4h
为四个小时后就会端口。
proxy_http_version
:使用websocket 需要将http 设置成1.1 版本,因为默认nginx 的http 协议版本那是1.0,不支持websocket 功能
Upgrade $http_upgrade
:保持默认
Connection "upgrade"
:保持默认
proxy_redirect
: 使用websocket 需要关闭代理重定向
静态资源映射配置
很多时候我们需要将服务器的一个目录定义为资源目录,通过nginx 进行请求转发去访问。
# 静态资源映射
location ^~ /resource/
{
alias /data/resource/;
autoindex on;
}
alias
:设置一个可访问的路径。
autoindex
:该命令设置为on
时,会开启文件目录访问功能,可以直接在web 浏览器中显示出目录中的所有文件信息。
https 配置
server
{
listen 443 ssl;
server_name domain.com domain2.com;
charset utf-8;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css;
gzip_disable "MSIE [1-6]\\.";
gzip_vary on;
ssl_certificate /**/server.crt;
ssl_certificate_key /**/server.key;
location /api
{
proxy_pass http://my-service/api;
}
}
对于配置https 来讲,与http 协议的区别就是需要配置ssl_certificate
与ssl_certificate_key
密钥证书和密钥key。
- 这两个证书文件是可以自己生成的,也可以使用浏览器信任的机构生成的证书,自己生成的ssl 证书是不会被浏览器认可的,会有异常的提示,而使用机构申请的证书则会正常显示。
- 自己可以使用
openssl
等工具进行ssl 证书的生成。- 如果浏览的链接不是需要显示在浏览器页面中的,是可以使用自己生成的ssl 证书进行https 协议的配置,
配置http 协议自动上升跳转https 协议请求
对于协议自动上升的问题,可以配置http 请求的rewrite
server {
listen 80;
server_name localhost;(域名)
rewrite ^(.*)$ https://$host$1 permanent;
}
将http 请求重写到https 的协议上就可以了。
以上是关于Nginx 常用安装配置与问题解析的主要内容,如果未能解决你的问题,请参考以下文章