# Nginx服务器的安装与配置__从0开始 **Repository Path**: han-dongyu111/Nginx ## Basic Information - **Project Name**: Nginx服务器的安装与配置__从0开始 - **Description**: Nginx服务器保姆级的教程,实现nginx服务器的反向代理、动静分离、负载均衡、跨域问题、gzip页面压缩技术 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-10-04 - **Last Updated**: 2023-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: Nginx ## README # Nginx服务器的安装与配置__从0开始 #### 介绍 Nginx服务器保姆级的教程,实现nginx服务器的反向代理、动静分离、负载均衡、跨域问题、gzip页面压缩技术 #Ubuntu下的nginx安装与配置 (包括nginx服务器的反向代理、动静分离、负载均衡、跨域问题、gzip页面压缩技术) ##一、执行下面的命令安装Nginx ```` sudo apt-get install nginx ```` ##二、启动 Nginx ###2.1 执行下面的命令启动Nginx ```` sudo service nginx start ```` ###2.2 启动之后,我们看一下 Nginx 是否处于运行状态。 ``` sudo service nginx status ``` #####2.3正常出现active就是启动成功了 #### 2.4重启命令 ``` sudo service nginx restart ``` ## 三. Nginx 操作常用命令 3.1 Nginx 的命令在控制台中输入 `nginx -h` 就可以看到完整的命令。 `systemctl` 是 Linux 系统应用管理工具 `systemd` 的主命令,用于管理系统,我们也可以用它来对 Nginx 进行管理,相关命令如下: ```bash systemctl start nginx # 启动 Nginx systemctl stop nginx # 停止 Nginx systemctl restart nginx # 重启 Nginx systemctl reload nginx # 重新加载 Nginx,用于修改配置后 systemctl enable nginx # 设置开机启动 Nginx systemctl disable nginx # 关闭开机启动 Nginx systemctl status nginx # 查看 Nginx 运行状态 ``` #四、Nginx 的反向代理 ##4.1正向代理和反向代理的概念 反向代理(Reverse Proxy)对应的是正向代理(Forward Proxy),他们的区别: **正向代理:** 一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见; 举个具体的例子 ??,你的浏览器无法直接访问谷哥,这时候可以通过一个代理服务器来帮助你访问谷哥,那么这个服务器就叫正向代理。 **反向代理:** 与一般访问流程相比,使用反向代理后,直接收到请求的服务器是代理服务器,然后将请求转发给内部网络上真正进行处理的服务器,得到的结果返回给客户端。反向代理隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。 举个具体的例子 ??,去饭店吃饭,可以点川菜、粤菜、江浙菜,饭店也分别有三个菜系的厨师 ?????,但是你作为顾客不用管哪个厨师给你做的菜,只用点菜即可,小二将你菜单中的菜分配给不同的厨师来具体处理,那么这个小二就是反向代理服务器。 简单的说,一般给客户端做代理的都是正向代理,给服务器做代理的就是反向代理。 正向代理和反向代理主要的原理区别可以参见下图: ![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9YUDRkUkloWnFxWDczNGpGMEdraWJjUXdDSmgyOTBTbGVNVGV4UEZpYm9mUXhDN2tIUUluSVJKeU1aQlYzNzBsU3l1NHNISjhKM0xmVkFmZG5vU3VWeUdnLzY0MA?x-oss-process=image/format,png) ## 4.2反向代理的具体配置 ### 4.2.1首先进入 Nginx 的主配置文件: ```groovy vim /etc/nginx/nginx.conf #nginx.conf 默认是安装在/etc/nginx文件夹下的 ``` ### 4.2.2 配置`http`模块的 `server` 块中的 `location /` 然后我们去 `http`模块的 `server` 块中的 `location /`,增加一行将默认网址重定向到我们自己的ip地址 。即 `proxy_pass` 配置 : ```` proxy_pass http://myserver; #这里面的myserver就是我们的ip地址 例如http://123.249.1.68:8080 ```` 改完保存退出,`nginx -s reload` 重新加载,进入默认网址,那么现在就直接http://123.249.1.68:8080 了,实现了一个简单的代理。 ### 4.2.3 根据访问的路径跳转到不同端口的服务中。 实际使用中,可以将请求转发到本机另一个服务器上,也可以根据访问的路径跳转到不同端口的服务中。 比如我们监听 `9001` 端口,然后把访问不同路径的请求进行反向代理: 1. 把访问 `http://127.0.0.1:9001/edu` 的请求转发到 `http://127.0.0.1:8080` 2. 把访问 `http://127.0.0.1:9001/vod` 的请求转发到 `http://127.0.0.1:8081` 这种只要打开`nginx.conf`主配置文件,然后在 http 模块下增加一个 server 块: ```` server { listen 9001; server_name localhost; location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; } } ```` 这样就可以根据访问的路径跳转到不同端口的服务中。 server 块可以包含多个 location 块,location 指令用于匹配 uri,语法: ```css location [ = | ~ | ~* | ^~] uri { ... } ``` 指令后面: 1. `=` 精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找; 2. `^~` 用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找; 3. `~` 表示用该符号后面的正则去匹配路径,区分大小写; 4. `~*` 表示用该符号后面的正则去匹配路径,不区分大小写。跟 `~` 优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个; 如果 uri 包含正则表达式,则必须要有 `~` 或 `~*` 标志。 #五、Nginx 的动静分离 ##5.1 动静分离的概念 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。 ![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9YUDRkUkloWnFxWDczNGpGMEdraWJjUXdDSmgyOTBTbGVTWTU2SnpjWTRZUVlzbnVpYjRSQ1ZEMWpRWDVtbzdqQTFKUWNEaWFkOXY2UGliY1RmY205MHh5ZUEvNjQw?x-oss-process=image/format,png) 动静分离 一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。 使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。 ##5.2 动静分离的具体配置 ### 5.2.1首先进入 Nginx 的主配置文件: ```groovy vim /etc/nginx/nginx.conf ``` ### 5.2.2 向`http`模块的 `server` 中添加location: 我们找到`http`模块的 `server` 块 添加如下loaction: ```` #静态资源缓存设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { root /opt/gain/; expires 5m; } location ~ .*\.(js|css)?$ { root /opt/gain/; expires 5m; } #动态资源设置 location / { #这里面myserver是 upstream中的myserver内容 proxy_pass http://myserver; } ```` 这样 我们请求静态文件的时候就会指向nginx服务器中路径中的静态文件 动态请求的时候就会指向tomact服务器 可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。 #六、Nginx 的负载均衡 ##6.1 负载均衡的概念 一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。 这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。 很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。 请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是**负载均衡**,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。 举个具体的例子 ??,晚高峰乘坐地铁的时候,入站口经常会有地铁工作人员大喇叭“请走 B 口,B 口人少车空....”,这个工作人员的作用就是负载均衡。 ![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9YUDRkUkloWnFxWDczNGpGMEdraWJjUXdDSmgyOTBTbGVPaWNxV0JZN1dNZHlRZlhSV05DZUk0V0tqUndVOTR0NG5PTnUwV1lUTm9jSUUxU01XTjZoZ1NRLzY0MA?x-oss-process=image/format,png) ##6.2 负载均衡的具体配置 ### 6.2.1首先进入 Nginx 的主配置文件: ```groovy vim /etc/nginx/nginx.conf ``` ### 6.2.2 向`http`模块的中添加upstream: 我们找到`http`模块的,添加如下upstream: ```` upstream myserver { server 123.249.1.68:8080; server 123.249.1.68:81; } ```` ![img](images/img.png) 我们拿一台服务器的不同端口来举例 使用轮询的机制,当我们第一次访问 `123.249.1.68:8070` 的时候 会指向 8080端口的页面 当再次刷新的时候 会指向81端口的页面 Nginx 提供了好几种分配方式,默认为**轮询**,就是轮流来。有以下几种分配方式: 1. **轮询**,默认方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务挂了,能自动剔除; 2. **weight**,权重分配,指定轮询几率,权重越高,在被访问的概率越大,用于后端服务器性能不均的情况; 3. **ip_hash**,每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决动态网页 session 共享问题。负载均衡每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的; 4. **fair**(第三方),按后端服务器的响应时间分配,响应时间短的优先分配,依赖第三方插件 nginx-upstream-fair,需要先安装; # 7 配置 header 解决跨域 ### 7.1首先进入 Nginx 的主配置文件: ```groovy vim /etc/nginx/nginx.conf ``` ### 7.2 向`http`模块的中`server`中添加如下命令: ```` add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods GET,POST; ```` 具体位置如下图: ![img](images/img_1.png) 这时访问我们的网页,就可以看到请求头了: ![img](images/img_2.png) # 8Nginx 配置 gzip ### 8.1首先进入 Nginx 的主配置文件: ```groovy vim /etc/nginx/nginx.conf ``` ### 8.2 向`http`模块的中`server`中添加如下命令: ```` gzip on; gzip_min_length 1k; gzip_buffers 4 64k; gzip_http_version 1.1; gzip_comp_level 6; gzip_vary on; gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml image/jpg image/jpeg image/png; ```` 整体代码如下图: ![img](images/img_3.png) 我们可以看到网页配置之后 response 的 header 里面多了一个 Content-Encoding: gzip,返回信息被压缩了: ![img](images/img_4.png) 稍微解释一下: 1. **gzip_types**:要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用; 2. **gzip_static**:默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 `.gz` 文件内容; 3. **gzip_proxied**:默认 off,nginx做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩; 4. **gzip_vary**:用于在响应消息头中添加 `Vary:Accept-Encoding`,使代理服务器根据请求头中的 `Accept-Encoding` 识别是否启用 gzip 压缩; 5. **gzip_comp_level**:gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6; 6. **gzip_buffers**:获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得; 7. **gzip_min_length**:允许压缩的页面最小字节数,页面字节数从header头中的 `Content-Length` 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大; 8. **gzip_http_version**:默认 1.1,启用 gzip 所需的 HTTP 最低版本; #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)