Nginx 常用安装配置与问题解析

Posted Kelin.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 nginxnginx
服务重启:systemctl restart nginxnginx -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 来讲,重要的就是listenserver_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_certificatessl_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 常用安装配置与问题解析的主要内容,如果未能解决你的问题,请参考以下文章

nginx启动与配置

nginx的安装配置详解

Nginx 配置解析

Nginx一篇足够

Nginx常用HTTP模块配置解析

003.Nginx配置解析