nginx的下载、相关配置的介绍

Nginx是一个高性能的HTTP和反向代理web服务器,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。作为一款轻量级的Web 服务器/反向代理服务器及电子邮件代理服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好

  1. 其中conf是配置文件夹,html是静态网站的根目录,logs是运行日志,temp是临时文件,docs存放文档,contrib存放由其他机构贡献的文档材料,nginx.exe是window下的可运行程序。
  2. 如果双击exe后页面无法正常显示,且logs/error.log记录 [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access,参考如下方法解决方法,记得重启电脑
  3. windows系统下常用的nginx命令 (在下载nginx的文件夹下打开cmd运行):
  • start nginx:启动nginx
  • nginx.exe -s stop:快速关闭nginx,不保存相关信息并迅速终止web服务
  • nginx.exe -s quit:平稳关闭nginx,保存相关信息并有安排的结束web服务
  • nginx.exe -s reload:因改变了nginx相关配置,需要重新加载配置而重载
  • nginx.exe -s reopen:重新打开日志文件
  • nginx.exe -c filename:为nginx指定配置文件用来代替缺省的
  • nginx.exe -t:不运行,仅测试配置文件,检查配置文件的语法的正确性
  • nginx.exe -v:显示nginx的版本
  • nginx.exe -V:显示nginx的版本、编译器版本和配置参数
  • 配置文件介绍(/conf/nginx.conf

#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;

  • 以上内容是基本配置。user配置用户或组,默认nobody;worker_processes配置允许生成的进程数,默认是1;error_log配置日志路径和级别;pid指定nginx进程运行文件存放地址。

events {
accept_mutex on;
multi_accept on;
#use epoll;
worker_connections 1024;
}

  • 以上内容是event块,accept_mutex设置网络连接序列化,multi_accept设置一个进程是否同时接受多个网络连接,use设置事件驱动模型,worker_connections设置最大连接数,默认1024
    计算max_client:当nginx作为http服务器,max_client=worker_connections * worker_processes,当作为反向代理服务器时,max_client=worker_connections * worker_processes/4
http {
include       mime.types;
default_type  application/octet-stream;

#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  logs/access.log  main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }

    #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   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;
    #}
}

以上是html配置,笔者开发中常用的有:include配置了nginx支持哪些文件扩展名和文件类型映射表,在cong/mine.types可查看;default_type配置默认支持文件类型,sendfile为on允许sendfile方式传输文件,开启高效传输模式,tcp_nopush为on防止网络阻塞,location下的root配置网站的根目录,location下的index配置默认打开的页面,keepalive_timeout设置长连接超时时间,gzip为on开启gzip压缩
关于长连接和短链接,注意在使用长连接的时候响应头会加入Connection:keep-alive

其他配置暂省略。


使用gzip

  • 关于gzip压缩以及nginx中gzip的配置
  • 启用gzip压缩功能, 可以使网站的css、js 、xml、html 等静态资源在传输时进行压缩,经过gzip压缩后资源可以变为原来的30%甚至更小,尽管这样会消耗一定的cpu资源,但是会节约大量的出口带宽来提高访问速度。
  • nginx 配置
#开启gzip
gzip  on;  
#低于1kb的资源不压缩 
gzip_min_length 1k;
#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。 
gzip_comp_level 5; 
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;  
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable "MSIE [1-6]\.";  
#是否添加“Vary: Accept-Encoding”响应头
gzip_vary on;

nginx反向代理

  • 关于正向代理和反向代理,要注意的是正向代理是作用在客户端的而反向代理是作用在服务端的,正向代理即代理客户端发送请求,真是的客户端对服务端是不可见的,服务端拿到的是代理服务器的ip。而反向代理是指以代理服务器接收客户端请求,代理服务器将请求发给真正的服务端并从真正的服务端得到请求结果,再将请求结果返回给客户端,真实的服务端对客户端是不可见的。
    关于浏览器跨域问题,一般由后端设置cors,如果后端没有设置cors则前端配置反向代理。
    nginx是反向代理服务器
  • nginx配置反向代理案例
    此处前端使用vue3,后端使用express,模拟在后端没配置cors的情况下解决打包上线后的跨域问题:
  • 后端代码
const express = require('express')
	const router = express.Router()
	const app = express()
	// const cors = require('cors')
	// app.use(cors())
	// 后端不配置跨域
	router.get('/test_1', function (require, response) {
	response.send({
		status: 1000,
		msg: 'ok'
	  })
	})
	app.use('/api', router)
	app.listen(3007, () => {
		console.log('express is running at http://127.0.0.1:3007')
	})
  • 前端代码
// .env,production
	VITE_APP_BASE_API = '/nginxApi' 
	
	// App.vue
	<script setup>
	import useText_1 from "./hook/text_1";
	import axios from "axios";
	const myRequest = function () {
		axios({
			baseURL:import.meta.env.VITE_APP_BASE_API,
			url: "/api/test_1",
		});
	};
	</script>
	<template>
		<button @click="myRequest">点击发送请求</button>
	</template>
  • nginx配置

    至此我们简单的反向代理就算配置完成了。

集群和负载均衡

  • 集群:将一个应用程序部署到多台服务器上面,然后在这些服务器的前面通过负载均衡服务器来择优选择哪一台服务器去执行,保证了高可用。
  • 负载均衡
  • 负载均衡高是网络基础架构的一个关键组成部分,在提高网站、应用、数据库或者其他服务的性能以及可靠性方面发挥着重要作用。
  • nginx常见的负载均衡策略:
  • 轮询:默认的,使用最多的,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器死机则自动剔除。
  • 指定轮询几率:配置中的weight与访问比例成正比,默认为1。
  • ip_hash:每个请求按照访问的ip的hash进行分配,这样同一客户端的连续web请求都会被分发到同一台服务器进行处理,但是会造成后端服务器集群负载不均衡的问题。
  • nginx的集群和负载均衡配置
    仍然借用上一小节的例子,只是后端多开了一台3008服务器,并且返回的status改为2000,只需要在nginx配置文件的http模块下进行如下修改即可: