Nginx的配置记了忘,忘了记,这东西,一般就是一套配置,到处复制,然后改改,绝大多数时候对于我们的要求就是需要知道改什么地方,nginx相关的博客,我好像不止写了一次,然而属实不怎么常用,学得快,忘得更快,然后借这次吧,重新再写一下。nginx的配置难以理解的地方。就是配置https,其实也没有什么复杂的。
教程准备 环境 如日中天的CenterOs倒了(停止维护)。于是我就换上了Ubuntu。
Linux系统:Ubuntu20.x.x
安装方式 两种安装方式,使用命令式的安装是最为简单的,但受限于网络。下载源码编译安装最为通用,但是有一点繁琐。
APT(软件源)安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyringcurl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key <signing-key@nginx.com> sudo apt updatesudo apt install nginxnginx -v curl https://localhost <!DOCTYPE html> <html> <head > <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/" >nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/" >nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
按照上面的操作如果出现最后的Html文档说明已经正确安装了。
源码安装 比较通用的一种安装方法。首先下载安装包。nginx下载 ,下载稳定版的即可。我这里下载的是nginx-1.20.2 ,点击下载到本地,上传到你的Linux服务器上。上传方法不限,弄到服务器的文件夹里即可。
进入存放tar.gz文件的目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 tar -zxcf nginx-1.20.2.tar.gz cd nginx-1.20.2mkdir /var/temp/nginx -papt install build-essential libssl-dev libghc-zlib-dev libpcre3-dev ./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/client \ --http-proxy-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi \ --with-http_ssl_module checking for OS + Linux 5.13.0-37-generic x86_64 checking for C compiler ... not found ./configure: error: C compiler cc is not found apt install build-essential libssl-dev libghc-zlib-dev libpcre3-dev nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/var/run/nginx/nginx.pid" nginx error log file: "/var/log/nginx/error.log" nginx http access log file: "/var/log/nginx/access.log" nginx http client request body temporary files: "/var/temp/nginx/client" nginx http proxy temporary files: "/var/temp/nginx/proxy" nginx http fastcgi temporary files: "/var/temp/nginx/fastcgi" nginx http uwsgi temporary files: "/var/temp/nginx/uwsgi" nginx http scgi temporary files: "/var/temp/nginx/scgi"
命令
解释
–prefix
指定nginx安装目录
–pid-path
指定nginx的pid
–lock-path
锁定安装文件,防止篡改
–error-log-path
错误日志
–http-log-path
日志
–http-log-path
日志
–with-http_gzip_static_module
启用gzip模块,在线实时压缩输出数据流
–http-client-body-temp-path
设定客户端请求临时目录
–http-proxy-temp-path
设定http代理临时目录
–http-fastcgi-temp-path
设定fastcgi临时目录
–http-uwsgi-temp-path
设定uwsgi临时目录
–http-scgi-temp-path
设定scgi临时目录
–with-http_ssl_module
启用Https模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 make make install ./nginx ./nginx -s stop ./nginx -s reload
在Ubuntu上nginx安装的两种方式都已介绍完毕,如果你用的是CentOs,那很可惜,教程并不适用。我这边呢是建议使用apt,yum这种工具去安装nginx的,优点有很多。
第一:节省服务器空间因为不需要编译环境,第二,节省开发者生命。
浅说一下APT和Yum…等等类似工具究竟是什么东西 我们在搜索的时候,有时会搜到一些apt-get命令的操作。
使用apt-get的主流Linux系统包括Debian和Ubuntu变异版本。大多数情况下,从命令行运行该工具。桌面上有几个图形前端可以使用,包括Synaptic Package Manager、Ubuntu Software Center、Aptitude和Kpackage。 Raspberry Pi和Beaglebone Black nanoLinux版用户可以很容易地使用apt-get加载程序,因为这些系统通常来自Ubuntu或Debian代码。是debian,ubuntu发行版的包管理工具,与红帽中的「yum」工具非常类似。 apt-get命令一般需要「root权限」执行,所以一般跟着sudo命令。 apt 命令行实用程序于2014年推出第一个稳定版本,用于 Debian 发行版 .deb 软件包安装。它最初在不稳定的Debian版本中使用,然后在Debian 8中成为标准。 在 Ubuntu 16.04 发行后,apt 开始流行,并以某种方式取代了 apt-get 。 随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。 大多数人不了解 apt 和 apt-get 之间的区别,并且经常在使用一个或另一个时感到困惑。 两者都是开源命令行工具,用于管理软件包,例如安装,更新,升级和删除。 但是,它们之间仍然存在一些差异。
apt apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。 apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。 apt 命令执行需要超级管理员权限(root)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 root@ubuntu:/usr/local/nginx/sbin# apt -h apt 2.0.6 (amd64) 用法: apt [选项] 命令 命令行软件包管理器 apt 提供软件包搜索,管理和信息查询等功能。 它提供的功能与其他 APT 工具相同(像 apt-get 和 apt-cache), 但是默认情况下被设置得更适合交互。 常用命令: list - 根据名称列出软件包 search - 搜索软件包描述 show - 显示软件包细节 install - 安装软件包 reinstall - 重新安装软件包 remove - 移除软件包 autoremove - 卸载所有自动安装且不再使用的软件包 update - 更新可用软件包列表 upgrade - 通过 安装/升级 软件来更新系统 full-upgrade - 通过 卸载/安装/升级 来更新系统 edit-sources - 编辑软件源信息文件 satisfy - 使系统满足依赖关系字符串 参见 apt(8) 以获取更多关于可用命令的信息。 程序配置选项及语法都已经在 apt.conf(5) 中阐明。 欲知如何配置软件源,请参阅 sources.list(5)。 软件包及其版本偏好可以通过 apt_preferences(5) 来设置。 关于安全方面的细节可以参考 apt-secure(8). 本 APT 具有超级牛力。
Yum yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。(一般CentOS就用这个) 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1. 列出所有可更新的软件清单命令:yum check-update 2. 更新所有软件命令:yum update 3. 仅安装指定的软件命令:yum install <package_name> 4. 仅更新指定的软件命令:yum update <package_name> 5. 列出所有可安裝的软件清单命令:yum list 6. 删除软件包命令:yum remove <package_name> 7. 查找软件包命令:yum search <keyword> 8. 清除缓存命令: yum clean packages: 清除缓存目录下的软件包 yum clean headers: 清除缓存目录下的 headers yum clean oldheaders: 清除缓存目录下旧的 headers yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers
默认配置解读 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Default文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri / =404; } }
学习一途,欲速则不达,真的当你完全弄懂这些配置中的符号的意思之后,你再看这些配置你的感觉是不一样的。当然我也是在一点一点的学习,我甚至装了个有图形化的Ubuntu虚拟机,为了研究nginx,这个默认生成的配置文件,我一开始是看不懂的,我也看了很长时间。😂😂😂
安装nginx没有生成各类目录文件问题解决 由于途中我需要手动安装一次,我就把使用apt安装的nginx给卸载了,并且把配置文件给删了,我再次使用apt安装时,发现不重新生成默认配置了。解决办法。依次执行。
1 2 3 4 5 6 7 sudo apt-get --purge remove nginx-commonsudo apt-get --purge remove nginx*sudo apt-get autoremovesudo apt install nginx
常用配置的介绍以及样例 侦听端口 1 2 3 4 5 6 7 8 9 10 11 12 server { # Standard HTTP Protocol listen 80; # Standard HTTPS Protocol listen 443 ssl; # For http2 listen 443 ssl http2; # Listen on 80 using IPv6 listen [::]:80; # Listen only on using IPv6 listen [::]:80 ipv6only=on; }
访问日志 1 2 3 4 5 6 server { # Relative or full path to log file access_log /path/to/file.log; # Turn 'on' or 'off' access_log on; }
域名 1 2 3 4 5 6 7 8 9 10 11 12 server { # Listen to yourdomain.com server_name yourdomain.com; # Listen to multiple domains server_name yourdomain.com www.yourdomain.com; # Listen to all domains server_name *.yourdomain.com; # Listen to all top-level domains server_name yourdomain.*; # Listen to unspecified Hostnames (Listens to IP address itself) server_name ""; }
静态资产 1 2 3 4 5 6 7 8 server { listen 80; server_name yourdomain.com; location / { root /path/to/website; } }
重定向 1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name www.yourdomain.com; return 301 http://yourdomain.com$request_uri; } server { listen 80; server_name www.yourdomain.com; location /redirect-url { return 301 http://otherdomain.com; } }
负载均衡 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 # []表示需要填写, # nginx默认采用轮训的方式进行负载均衡 upstream [proxyName] { server 192.168.1.173:8080; server 192.168.1.174:8080; server 192.168.1.175:8080; } # 加权轮询值越高访问频率越高 upstream [proxyName] { server 192.168.1.173:8080 weight=1; server 192.168.1.174:8080 weight=5; server 192.168.1.175:8080 weight=2; } # hash 负载均衡 upstream [proxyName] { ip_hash server 192.168.1.173:8080; server 192.168.1.174:8080; server 192.168.1.175:8080; } # hash 算法实际上只会计算 192.168.1这段做哈希# 使用ip_hash的注意点:不能把后台服务器直接移除,只能标记down. # url hash 负载均衡 upstream [proxyName] { hash $request_url; server 192.168.1.173:8080; server 192.168.1.174:8080; server 192.168.1.175:8080; } # 最小连接负载均衡 upstream [proxyName] { least_conn; server 192.168.1.173:8080; server 192.168.1.174:8080; server 192.168.1.175:8080; }
keepalived 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 upstream [proxyName] { server 192.168.1.173:8080 weight=1; server 192.168.1.174:8080 weight=5; server 192.168.1.175:8080 weight=2; keepalive 32; #保持的连接数 } server { listem 80; server_name www.tomcats.com; location / { proxy_pass http://tomcats; proxy_http_version 1.1; #连接的协议版本 proxy_set_header Connection ""; 清空连接请求头 } }
控制浏览器缓存 1 2 3 4 5 6 7 8 9 10 11 12 13 14 server { listem 80; server_name www.tomcats.com; location / { proxy_pass http://tomcats; expires 10s; #浏览器缓存10秒钟 #expires @22h30m #在晚上10点30的时候过期 #expires -1h #缓存在一小时前时效 #expires epoch #不设置缓存 #expires off #缓存关闭,浏览器自己控制缓存 #expires max #最大过期时间 } }
反向代理缓存 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 upstream [proxyName] { server 192.168.1.173:8080 weight=1; server 192.168.1.174:8080 weight=5; server 192.168.1.175:8080 weight=2; } # proxy_cache_path 设置缓存保存的目录的位置 # keys_zone设置共享内以及占用的空间大小 # mas_size 设置缓存最大空间 # inactive 缓存过期时间,错过此时间自动清理 # use_temp_path 关闭零时目录 proxy_cache_path /usr/local/nginx/upsteam_cache keys_zone=mycache:5m max_size=1g inactive=8h use_temp_path=off; server { listem 80; server_name www.tomcats.com; #开启并使用缓存 proxy_cache mycache; #针对200和304响应码的缓存过期时间 proxy_cache_valid 200 304 8h; location / { proxy_pass http://tomcats; } }
反向代理 1 2 3 4 5 6 7 8 server { listen 80; server_name yourdomain.com; location / { proxy_pass http://0.0.0.0:3000; # where 0.0.0.0:3000 is your application server (Ex: node.js) bound on 0.0.0.0 listening on port 3000 } }
SSL 协议 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 server { listen 443 ssl; server_name yourdomain.com; ssl on; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/privatekey.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/fullchain.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_timeout 1h; ssl_session_cache shared:SSL:50m; add_header Strict-Transport-Security max-age=15768000; } # Permanent Redirect for HTTP to HTTPS server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; }
其实可以采用可视化的方式对 Nginx 进行配置,我在 GitHub 上发现了一款可以一键生成 Nginx 配置的神器,相当给力。
先来看看它都支持什么功能的配置:反向代理、HTTPS、HTTP/2、IPv6, 缓存、WordPress、CDN、Node.js 支持、 Python (Django) 服务器等等。
如果你想在线进行配置,只需要打开网站:https://nginxconfig.io/ ,按照自己的需求进行操作就行了。
操作这个的前提,也是需要你懂!!别人的理所当然是了如指掌做到的。
实战 简单的部署前后台分离的项目配置 部署前后台分离的项目,随便新建个html项目,里面写一个按钮用来发送Ajax请求。多说两句,webpack项目只是”方便“了开发,最终的产物依然是Html,Css,JavaScript。我们先手撸一个简单的项目前台项目。项目要求就是有个页面,有个按钮。点击能发送Ajax请求,且能把请求的返回内容回馈给用户。需求有了,idea打开,开码!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" /> <title > </title > <script type ="text/javascript" src ="js/jq/jquery-3.6.0.js" > </script > </head > <style > .app { display : flex; justify-content : center; } .red { color : red; } .green { color : green; } </style > <body > <div class ="app" id ="app" > <div id ="msg" > 请点击按钮</div > </div > <div class ="app" > <button type ="button" onclick ="send()" > 点击发送请求</button > </div > <script > let send = function ( ) { $.ajax ({ url : 'api/get' , type : 'get' , dataType : 'json' , success : function (res ) { $('#msg' ).remove (); $('#app' ).html ('<div id="msg" class="green">返回内容:' +res.msg +'<div>' ) }, error : function (xhr,status,e ) { $('#msg' ).remove (); $('#app' ).html ('<div id="msg" class="red">请求错误<div>' ) } }) } </script > </body > </html >
代码写好了,部署。这个很简单啊,你要是图省事,直接覆盖默认配置文件夹中的index.html即可,
很快啊,前台项目部署好了。
这时候我们需要部署后端项目了。idea打开新建springboot项目。开码!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Component public class ConfigWeb implements ApplicationListener <WebServerInitializedEvent> { private int serverPort; public String getUrl () { InetAddress address = null ; try { address = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } return "http://" + address.getHostAddress() +":" +this .serverPort; } @Override public void onApplicationEvent (WebServerInitializedEvent event) { this .serverPort = event.getWebServer().getPort(); } }
核心代码,get请求返回项目运行端口号。
1 2 3 4 5 6 7 8 9 10 11 12 @RestController @RequestMapping("/api") public class IndexController { @Resource private ConfigWeb configWeb; @GetMapping("/get") ResponseEntity<Map<String,Object>> get () { HashMap<String, Object> map = new HashMap <>(); map.put("msg" ,"服务端口" +configWeb.getUrl()); return ResponseEntity.ok(map); } }
核心代码如上图。
很快啊后端也不,后端快不起来,需要装Java环境。稍等,很快啊后端也部署好了。后台服务的端口是8081。这时候我们很自然的想到了,把之前的Ajax中的请求urlapi/get
换成http://localhost:8081/api/get
,这样前后台应该就能连通了。于是改了一下刷新页面,再次点击,还是不行。
报错信息:
1 已拦截跨源请求:同源策略禁止读取位于 http://localhost:8081/api/get 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin' )。状态码:200。
火狐浏览器是这样提示的,别的浏览器可能会有些许的差别,但不重要,重要的是,我们的前后台并没有连通!! 这个时候我们需要配置反向代理了,来规避跨域的错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 在配置文件的根目录中块,upstream 后面的字符并不是标识符, # 你可以写别的如tomcat,我这里是写成了nginx。 # 这个块里的server是可以有多个的。这就是传说中的负载均衡。 # 你配一个就用来做简单的反向代理即可。配多个就是负载均衡。 默认使用轮询, upstream nginx { server localhost:8081; } # 在server块中加一个location块。`/api/`,表示url中有`/api/`, # 执行这个逻辑,且别的location不在处理这个url请求 location /api/ { # 这里就是反向代理,http://后面的字符对应上面upstream块后的字符。 roxy_pass http://nginx; }
到这里配置结束,项目就是就可以正常启动了。需要弄负载均衡,你就多跑几个服务,能进行负载均衡的项目,对项目有一点点要求,要求项目本身必须是无状态的,不然的话可能会影响到正常使用,比如如果你这个项目中是在项目里也就是内存里保存的用户的登录状态,那么你负载均衡时,就会出问题,因为负载均衡默认是轮询,你可以理解成这个节点,你登陆过,你刷新一个页面,然后就访问了新的节点,但是你的登录信息是保存在上一个节点中的,这个新节点,并没有保存你的登录信息,你就需要重新登录。这就影响功能了。所以这种情况一般使用Redis来保存一些状态信息。就可以想跑几个项目就跑几个项目了。状态,这个概念可能难以理解,但是,官方文档英文就是这个意思,理解了自然也就理解了。加油。
全部配置文件nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; include /etc/nginx/conf.d/*.conf; upstream nginx { server localhost:8081; } server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location /api/ { proxy_pass http://nginx; } location / { try_files $uri $uri/ =404; } } }
配置SSL 使用openssl生成证书 openssl是目前最流行的SSL密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现。
比如生成到:/usr/local/ssl
1 openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /usr/local/ssl/nginx.key -out /usr/local/ssl/nginx.crt
生成好了,一般我们直接强制https,只需要配置一个重定向即可。
完整的配置nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; include /etc/nginx/conf.d/*.conf; # 这里是负载均衡。请求后端时建议使用这种方式。默认负载均衡是轮询,就是一个一个按顺序来 upstream nginx { # 生产上这里一般配置域名或者ip地址 server localhost:8081; server localhost:8082; } # HTTP redirect server { listen 80; listen [::]:80; # 生产上这里一般配置域名 server_name localhost; # http强制跳转https,可以理解为强制https return 301 https://localhost$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name localhost; # SSL 这里生产上需要换成生产上的证书位置即可。自己生成的证书浏览器并不认可。 ssl_certificate /usr/local/ssl/nginx.crt; ssl_certificate_key /usr/local/ssl/nginx.key; root /var/www/html; # 首页设置 index index.html index.htm index.nginx-debian.html; location /api/ { # 请求后端服务,这里访问的是配置的负载均衡服务器。 proxy_pass http://nginx; } location / { # 如果部署的是Vue等项目,这里可能需要改动, # 如果项目url中有#这个的,那就不要动,如果没有#的,那就需要改动。 try_files $uri $uri/ =404; } } }
常用的一般是反向代理和负载均衡。关于负载均衡的地方可以多看看,如果负载均衡中一个服务挂了的情况,会是怎么个处理情况,不同的负载均衡模式下,又有什么不同。等等,都是需要思考的。
最后应该是关于Ngixn的高可用,作为静态服务器时,Nginx的性能应该够用,反向代理时,我们主要考虑的应该是反向代理目标服务器的稳定。所以就暂且不研究Ngixn的高可用,一般主备双机之类的,真到Nginx扛不住的那时候,首先应该考虑的是架构的问题了。得上微服务了。