Nginx不仅具备反向代理、负载均衡、缓存服务等功能,还支持热部署。它几乎可做到7*24小时不间断运行,即使运行几个月也无需重启,还能在不间断运行的情况下热更新软件版本。Nginx主打高性能,其占用内存少、并发能力强、能支持高达50000个并发连接数,满足日常使用不在话下。
对于开发者来说Node并不陌生,Nginx与Node有着很多相似理念,例如HTTP服务器、事件驱动、非阻塞式I/O模型等,而Nginx很多功能使用Node也可实现,但两者并不冲突。Nginx擅长底层服务器资源的处理,Node擅长顶层具体业务逻辑的处理,两者可完美组合互相助力。
打开CMD工具,登录服务器。使用yum安装了Nginx,执行nginx -v,发现其版本不是最新版本。CentOS8自带的Nginx版本是1.14,因此自行创建高版本的Nginx源,在yum install nginx时才会安装最新版本的Nginx。
执行vim /etc/yum.repos.d/nginx.repo,加入以下内容。
1[nginx-stable] 2name=nginx stable repo 3baseurl=https://nginx.org/packages/centos/$releasever/$basearch/ 4gpgcheck=1 5enabled=1 6gpgkey=https://nginx.org/keys/nginx_signing.key 7module_hotfixes=true 8 9[nginx-mainline] 10name=nginx mainline repo 11baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/ 12gpgcheck=1 13enabled=0 14gpgkey=https://nginx.org/keys/nginx_signing.key 15module_hotfixes=true
执行yum info nginx查看最新版本。
1代码上次元数据过期检查:1:09:43 前,执行于 2022年05月29日 星期日 04时56分26秒。已安装的软件包 # 当前版本 2名称 : nginx 3时期 : 1 4版本 : 1.14.0 5... 6 7可安装的软件包 # 最新版本 8名称 : nginx 9时期 : 1 10版本 : 1.22.0 11...
再执行yum install nginx重新安装Nginx,再执行nginx -v,输出版本与上述信息一样表示更新成功。
打开FTP工具,发现很多Nginx配置文件存放在/ect/nginx目录中。虽然配置文件众多,但只需关注/etc/nginx/conf.d目录,该目录用于存放用户自定义的子配置文件。
主配置文件nginx.conf中有一行include /etc/nginx/conf.d/*.conf代码,其作用是当Nginx运行时,主配置文件会默认加载/etc/nginx/conf.d目录中所有子配置文件。
启动Nginx后,得益其安全稳定的特性,若未遇到特殊情况几乎都不会再重启,只需掌握以下命令就能操作nginx。
命令 | 功能 | |
---|---|---|
nginx | 启动进程 | |
nginx -t | 验证配置 | |
nginx -s reload | 重启进程 | |
nginx -s stop | 杀掉进程 | |
ps -ef | grep nginx | 查看进程 |
Nginx主配置文件是/etc/nginx/nginx.conf,可用vim /etc/nginx/nginx.conf查看配置。以下是nginx.conf的主体结构。
1nginx.conf # 全局配置 2├── events # 配置影响:Nginx服务器与用户的网络连接 3├── http # 配置功能:代理、缓存、日志等功能 4│ ├── upstream # 配置后端地址:负载均衡不可或缺的部分 5│ ├── server # 配置虚拟主机:一个http块可包括多个server块 6│ ├── server 7│ │ ├── location # 一个server块可包括多个location块 8│ │ ├── location # location块指令用于匹配URI 9│ │ └── ... 10│ └── ... 11└── ...
Nginx变量众多,可查看Nginx预定义变量,在此不深入讲述了。
启动Nginx后,若CentOS开启防火墙,还需在防火墙中加入需开放的端口让网站正常访问。CentOS默认安装了firewalld,可操作firewalld控制指定端口是否开放。
firewalld的基本使用可通过systemctl管理。systemctl是CentOS服务管理工具中的主要工具,其融合service与chkconfig的功能于一体,只需掌握以下命令就能操作firewalld。
命令 | 功能 |
---|---|
systemctl start firewalld | 开启防火墙 |
systemctl stop firewalld | 关闭防火墙 |
systemctl status firewalld | 查看防火墙状态 |
systemctl disable firewalld | 开机禁用防火墙 |
systemctl enable firewalld | 开机启用防火墙 |
那如何开放一个指定端口?跟着我的步伐,通过执行以下命令就可开放或关闭一个指定端口,以9999端口为例。
开放指定端口时追加--permanent表示开放端口永久生效,无该参数则重启防火墙会失效。在默认情况下,CentOS的防火墙是关闭的,因此无需主动开放指定端口。
在根目录中创建www文件夹,该文件夹中再创建两个文件夹,分别是client与server。client用于存放Web应用源码,server用于存放Node应用源码。
准备好个人官网源码,在client文件夹中创建yangzw文件夹,把源码拖到yangzw中,最终的入口文件路径是/www/client/yangzw/index.html。
在/etc/nginx/conf.d目录中创建yangzw.vip.conf文件,执行vim /etc/nginx/conf.d/yangzw.vip.conf,加入以下内容。
1server { 2 listen 80; 3 server_name yangzw.vip www.yangzw.vip; 4 location / { 5 root /www/client/yangzw; 6 index index.html; 7 } 8}
打开阿里云官网,选择右上角的控制台 → 左上角的菜单 → 云服务器ECS → 安全组 → 配置规则。再点击手动添加,增加安全组的配置。
手动增加80端口。执行nginx -t验证Nginx配置,再执行nginx -s reload重启Nginx进程。在浏览器地址栏中输入yangzw.vip,就可正常访问个人官网了。
通过第6章的方式在服务器中配置一个全新的static.yangzw.vip二级域名,该域名用于托管所有静态资源。
在www文件夹中创建static文件夹,该文件夹用于存放静态资源。
在/etc/nginx/conf.d目录中创建static.yangzw.vip.conf文件,执行vim /etc/nginx/conf.d/static.yangzw.vip.conf,加入以下内容。
1server { 2 listen 80; 3 server_name static.yangzw.vip; 4 location / { 5 root /www/static; 6 index index.html; 7 } 8}
在/www/static目录中创建index.html文件,随便编码。
编辑完毕执行nginx -t验证Nginx配置,再执行nginx -s reload重启Nginx进程。在浏览器地址栏中输入static.yangzw.vip,就可直接跳转到刚才创建的/www/static目录中。
通过上述方式可映射各种资源文件,例如在/www/static目录中创建img文件夹并复制一张图像nice.png,可通过http://static.yangzw.vip/img/nice.png访问该图像了。
当产生跨域时,配置Nginx处理该问题,就可无感知地继续保持开发进度,无需把实际访问的后端地址改成前端地址,这样适用性更高。
例如nice.yangzw.vip访问static.yangzw.vip,根据同源策略的定义,协议域名端口其一不同就是跨域。可通过配置Nginx的header解决跨域问题,继续以上述配置文件为例。
1server { 2 listen 80; 3 server_name static.yangzw.vip; 4 # 新增部分-开始 5 add_header "Access-Control-Allow-Origin" $http_origin; # 当前请求域名,不支持携带Cookie的请求 6 add_header "Access-Control-Allow-Credentials" "true"; # 请求可携带Cookie 7 add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS"; # 允许的请求方式 8 add_header "Access-Control-Allow-Headers" $http_access_control_request_headers; # 允许的请求Header,可设置为* 9 add_header "Access-Control-Expose-Headers" "Content-Length,Content-Range"; 10 if ($request_method = "OPTIONS") { 11 add_header "Access-Control-Max-Age" 18000000; # 请求的有效期:在有效期内无需发出另一条预检请求 12 add_header "Content-Length" 0; 13 add_header "Content-Type" "text/plain; charset=utf-8"; 14 } 15 # 新增部分-结束 16 location / { 17 root /www/static; 18 index index.html; 19 } 20}
编辑完毕执行nginx -t验证Nginx配置,再执行nginx -s reload重启Nginx进程。跨域问题完美解决。
目前动静分离的方式有两种解决方案。在生产条件充足的情况下,还是推荐使用第一种方案,当然第二种方案也能满足个人官网做动静分离的需求。
若使用Nginx配置动静分离,就无需使用二级域名了。上述在www文件夹中创建的client文件夹用于存放Web应用源码,创建的static文件夹用于存放静态资源。
1server { 2 listen 80; 3 location / { 4 root /www/client; # 存放动态资源(Web应用) 5 index index.html; 6 } 7 location /static/ { 8 root /www/staic; # 存放静态资源 9 autoindex on; # 开启资源目录 10 } 11}
编辑完毕执行nginx -t验证Nginx配置,再执行nginx -s reload重启Nginx进程。动静分离完美解决。
反向代理经常被用于处理跨域问题,以下问题就是最直接的体现。
创建二级域名api.yangzw.vip用于管理接口,在服务器的9999端口运行一个提供接口功能的Node服务。现在需将两者关联在一起,即在客户端中通过api.yangzw.vip可访问到服务端中127.0.0.1:9999的接口功能。
在/etc/nginx/conf.d目录中创建api.yangzw.vip.conf文件,执行vim /etc/nginx/conf.d/api.yangzw.vip.conf**,加入以下内容。
1server { 2 listen 80; 3 server_name api.yangzw.vip; 4 location / { 5 proxy_pass http://127.0.0.1:9999; 6 } 7}
编辑完毕执行nginx -t验证Nginx配置,再执行nginx -s reload重启Nginx进程。反向代理完美解决。
负载均衡是把负载均匀合理地分发到多个服务器中,实现压力分流的作用。
Nginx提供以下负载均衡方式,默认为轮询。
1http { 2 upstream api.yangzw.vip { 3 # ip_hash; # IpHash方式 4 # fair; # Fair方式 5 server 127.0.0.1:9999; # 负载均衡目的服务地址:可设置多个服务器 6 server 127.0.0.1:8888; 7 server 127.0.0.1:7777 weight=10; # 配置权重:不配置默认为1 8 } 9 server { 10 location / { 11 proxy_pass api.yangzw.vip; 12 proxy_connect_timeout 10; 13 } 14 } 15}
编辑完毕执行nginx -t验证Nginx配置,再执行nginx -s reload重启Nginx进程。负载均衡完美解决。
Letsencrypt提供一个称为certbot的工具,它可快速生成或刷新HTTPS证书。不过CentOS8的yum中未包括certbot源,所以无法使用yum安装。当然可用dnf代替yum安装certbot,CentOS8已内置dnf,它也是一个Shell软件包管理器。
打开CMD工具,登录服务器。执行dnf --version,输出版本表示软件可用。通过以下方式安装certbot。
增加epel源
1dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
更新dnf仓库
1dnf upgrade
安装snap
certbot官网也推荐使用snap安装certbot。
1dnf install snapd -y
设置开机自启
1systemctl enable --now snapd.socket
设置软链接
可通过snapd快速调用命令。
1ln -s /var/lib/snapd/snap /snap
更新快照
1snap install core 2snap refresh core
安装certbot
因为文件体积较大,安装有点慢,请耐心等待。
1snap install --classic certbot
设置软链接
可通过certbot快速调用命令。
1ln -s /snap/bin/certbot /usr/bin/certbot
相比CentOS7,CentOS8安装certbot复杂很多,一定要根据上述命令逐条执行完毕。若安装失败,请从第一步重新开始。
certbot安装完毕执行certbot --version,输出版本表示安装成功。
执行certbot --nginx扫描Nginx所有配置,输出以下信息。
1Saving debug log to /var/log/letsencrypt/letsencrypt.log 2Enter email address (used for urgent renewal and security notices) 3 (Enter 'c' to cancel): young.joway@aliyun.com 4 5- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6Please read the Terms of Service at 7https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must 8agree in order to register with the ACME server. Do you agree? 9- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 10(Y)es/(N)o: y 11 12- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 13Would you be willing, once your first certificate is successfully issued, to 14share your email address with the Electronic Frontier Foundation, a founding 15partner of the Let's Encrypt project and the non-profit organization that 16develops Certbot? We'd like to send you email about our work encrypting the web, 17EFF news, campaigns, and ways to support digital freedom. 18- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 19(Y)es/(N)o: n 20Account registered. 21 22Which names would you like to activate HTTPS for? 23- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 241: yangzw.vip 252: www.yangzw.vip 26- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 27Select the appropriate numbers separated by commas and/or spaces, or leave input 28blank to select all options shown (Enter 'c' to cancel): 1,2 29Requesting a certificate for yangzw.vip and www.yangzw.vip 30 31Successfully received certificate. 32Certificate is saved at: /etc/letsencrypt/live/yangzw.vip/fullchain.pem 33Key is saved at: /etc/letsencrypt/live/yangzw.vip/privkey.pem 34This certificate expires on 2022-05-23. 35These files will be updated when the certificate renews. 36Certbot has set up a scheduled task to automatically renew this certificate in the background. 37 38Deploying certificate 39Successfully deployed certificate for yangzw.vip to /etc/nginx/conf.d/yangzw.vip.conf 40Successfully deployed certificate for www.yangzw.vip to /etc/nginx/conf.d/yangzw.vip.conf 41Congratulations! You have successfully enabled HTTPS on https://yangzw.vip and https://www.yangzw.vip
翻译上述英文,跟随我填写。
HTTPS证书最终生成到/etc/letsencrypt/live/yangzw.vip目录中。打开FTP工具,进入到该目录,以下文件就是通过certbot自动签发的HTTPS证书。
HTTPS证书的有效期为三个月,三个月后不续签就会自动失效。因为certbot已设置开机自启,所以certbot会一直在后台运行,这些文件将在HTTPS证书续订时自动更新,以达到一直免费使用的效果。
签发HTTPS证书会自动修改对应Nginx配置文件。看看certbot对Nginx的配置文件做了哪些改动。还记得第7章个人官网的yangzw.vip.conf的内容吗?
1server { 2 listen 80; 3 server_name yangzw.vip www.yangzw.vip; 4 location / { 5 root /www/client/yangzw; 6 index index.html; 7 } 8}
执行vim /etc/nginx/conf.d/yangzw.vip.conf,发现变成以下内容。凡是后方有这段注释# managed by Certbot的代码都是由certbot生成。
1server { 2 server_name yangzw.vip www.yangzw.vip; 3 location / { 4 root /www/client/yangzw; 5 index index.html; 6 } 7 listen 443 ssl; # managed by Certbot 8 include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot 9 ssl_certificate /etc/letsencrypt/live/yangzw.vip/fullchain.pem; # managed by Certbot 10 ssl_certificate_key /etc/letsencrypt/live/yangzw.vip/privkey.pem; # managed by Certbot 11 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot 12} 13server { 14 if ($host = www.yangzw.vip) { 15 return 301 https://$host$request_uri; 16 } # managed by Certbot 17 if ($host = yangzw.vip) { 18 return 301 https://$host$request_uri; 19 } # managed by Certbot 20 listen 80; 21 server_name yangzw.vip www.yangzw.vip; 22 return 404; # managed by Certbot 23}
端口从原来的80改成443并从第一个server块移动到第二个server块中,第二个server块也是由certbot生成。
加入以下核心代码,告知Nginx要使用HTTPS协议,通过绝对路径导入证书文件。这些文件在上述已通过FTP工具展示出来了。
1ssl_certificate /etc/letsencrypt/live/yangzw.vip/fullchain.pem; 2ssl_certificate_key /etc/letsencrypt/live/yangzw.vip/privkey.pem;
加入两个if ($host = xyz) {}的判断,当使用非HTTPS协议访问域名时,直接301重定向到https://$host$request_uri。若出现其他情况则404。
certbot会根据选择的域名自动匹配出对应Nginx配置文件并对其做上述三部分改动,所以每次增加一个网站都需单独创建xyz.yangzw.conf文件到conf.d文件夹中,目的是为了隔离每个网站的Nginx配置。
在浏览器地址栏中输入https://yangzw.vip,发现网页404
。每次新开端口都需在服务器中配置安全组,可回看第7章的个人官网-安全组配置。这次增加443端口,在安全组中配置一个443端口。再次输入https://yangzw.vip就可正常访问了。
在浏览器地址栏中输入http://yangzw.vip,发现其重定向到https://yangzw.vip,后续所有网站都可通过该方案升级为HTTPS协议的网站了。
打开SslTest或SslChecker,输入域名就可检查证书是否有效。
Nginx在前端工程化中是一个很有分量的工具,其作为站服务器能解决很多请求或代理的网络问题。在后续实战中还会继续结合项目衍生Nginx的其他应用场景,如深度压缩、终端适配、图像防盗、路由刷新、请求过滤、文件缓存等应用场景。
得益于certbot才能无限期使用免费的HTTPS证书,更应响应号召,通过上述方案把所有HTTP协议网站升级HTTPS协议网站。