Nginx详细配置

Nginx的配置记了忘,忘了记,这东西,一般就是一套配置,到处复制,然后改改,绝大多数时候对于我们的要求就是需要知道改什么地方,nginx相关的博客,我好像不止写了一次,然而属实不怎么常用,学得快,忘得更快,然后借这次吧,重新再写一下。nginx的配置难以理解的地方。就是配置https,其实也没有什么复杂的。

教程准备

环境

如日中天的CenterOs倒了(停止维护)。于是我就换上了Ubuntu。

Linux系统:Ubuntu20.x.x

安装方式

两种安装方式,使用命令式的安装是最为简单的,但受限于网络。下载源码编译安装最为通用,但是有一点繁琐。

APT(软件源)安装

# 安装之前的准备
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

# 导入官方的nginx签名密钥,以便apt能够验证软件包的真实性
curl 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 update

# 安装 有提示,y 回车即可
sudo apt install nginx

# 测试是否成功安装, 输出版本号,即安装完成
nginx -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文件的目录下

# 解压源码文件
tar -zxcf nginx-1.20.2.tar.gz

# 进入解压后的文件中
cd nginx-1.20.2

# 创建一个缓存文件夹
mkdir /var/temp/nginx -p

# 安装生成安装文件前的必要依赖。
# 不建议手动编译安装属实是太麻烦了
apt install build-essential libssl-dev libghc-zlib-dev libpcre3-dev

# 在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件
# 注意一下配置中的目录即可
./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模块
# make编译
make

# 安装
make install

# 进入sbin目录启动nginx

# 启动:
./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)。

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. 列出所有可更新的软件清单命令: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

默认配置解读

# 运行用户,一般设置成root用户即可,百度了一下是用来控制权限的。根据Liunx系统的用户来配置即可,话说通过shell窗口来操作Linux的用户的相关命令,应该不常用。
user www-data;

# 启动进程,通常设置成和cpu的数量相等,auto 表示自动
worker_processes auto;
# 全局运行PID文件
pid /run/nginx.pid;
# 导入指定文件夹下所有以.conf结尾的配置文件,一般是一些模块的设置
include /etc/nginx/modules-enabled/*.conf;

events {
 # 单个后台worker process进程的最大并发链接数
 worker_connections 768;
 # multi_accept on;
}

# #设定http服务器,利用它的反向代理功能提供负载均衡支持
http {

 ##
 # 基本设置
 ##

 # sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
 # 必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
 sendfile on;
 # sendfile为on时这里也应该设为on,数据包会累积一下再一起传输,可以提高一些传输效率。
 tcp_nopush on;
 # 小的数据包不等待直接传输。默认为on。
 # 看上去是和tcp_nopush相反的功能,但是两边都为on时nginx也可以平衡这两个功能的使用。
 tcp_nodelay on;
 # 连接超时时间
 keepalive_timeout 65;
 # types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升。默认为1024
 types_hash_max_size 2048;
 # server_tokens off;

 # server_names_hash_bucket_size 64;
 # server_name_in_redirect off;

 # 定义MIME类型和后缀名关联的文件的位置。
 include /etc/nginx/mime.types;
 # 指定mime.types文件中没有记述到的后缀名的处理方法。默认值是text/plain。
 default_type application/octet-stream;

 ##
 # SSL设置
 ##

 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设置
 ##
 #开启gzip压缩
 gzip on;

 # gzip_vary on;
 # gzip_proxied any;
 # gzip_comp_level 6;
 # gzip_buffers 16 8k;
 # gzip_http_version 1.1;
 # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

 ##
 # 虚拟主机配置
 ## 

 # 重点就在这里,因为我们正常看这个配置文件,里面感觉是没有东西的。但是我们访问http://localhost是可以访问的到的。
 
 # 主要就是下面这两行  sites-enabled 这个文件夹下有个 default 文件。就是这个文件里面配置的东西,conf.d 这个文件夹是空文件夹,不看。
 include /etc/nginx/conf.d/*.conf;
 # 导入默认设置
 include /etc/nginx/sites-enabled/*;
}

# mail模块,用的不多
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
# server {
#  listen     localhost:110;
#  protocol   pop3;
#  proxy      on;
# }
# 
# server {
#  listen     localhost:143;
#  protocol   imap;
#  proxy      on;
# }
#}

Default文件

##
# 你应该看看下面的网址,以便掌握一个坚实的理解
# 为了充分发挥Nginx的威力,需要使用Nginx配置文件。
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# 在大多数情况下,管理员会从启用/和
# 将其保留为网站内的参考,以便继续使用
# 由nginx包装团队更新。
#
# 此文件将自动加载其他用户提供的配置文件
# 应用程序,如Drupal或Wordpress。这些申请将被提出
# 在具有该包名称的路径下可用,例如/drupal8。
#
# 请参阅/usr/share/doc/nginx doc/examples/了解更多详细示例。
##

# 默认服务配置
#
server {
 # listen指定端口号。
 listen 80 default_server;
 listen [::]:80 default_server;

 # SSL配置
 #
 # listen 443 ssl default_server;
 # listen [::]:443 ssl default_server;
 #
 # 注意:您应该为SSL通信禁用gzip。
 # See: https://bugs.debian.org/773332
 #
 # 阅读ssl_密码以确保安全配置。
 # See: https://bugs.debian.org/765782
 #
 # ssl证书包生成的自签名证书
 # 不要在生产服务器中使用它们!
 #
 # include snippets/snakeoil.conf;

 # 定义服务器的默认网站根目录位置。
 root /var/www/html;

 # 添加首页。如果使用php,请将php添加到列表中
 index index.html index.htm index.nginx-debian.html;
 # 指定服务器的域名。这个_和localhost的区别我也不是很清楚
 server_name _;

 location / {
  # 首先尝试将请求作为文件,然后
  # 作为目录,然后返回显示404。
  try_files $uri $uri/ =404;
 }

 # 将PHP脚本传递给FastCGI服务器
 #
 #location ~ \.php$ {
 # include snippets/fastcgi-php.conf;
 #
 # # 使用php fpm(或其他unix套接字):
 # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
 # # 使用php cgi(或其他tcp套接字):
 # fastcgi_pass 127.0.0.1:9000;
 #}

 # deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 # 拒绝访问。htaccess文件,如果Apache的文档根
 # 同意nginx的观点
 #
 #location ~ /\.ht {
 # deny all;
 #}
}


# Virtual Host configuration for example.com
# 例如,虚拟主机配置。example.com
#
# 您可以将其移动到“可用站点”下的另一个文件中,并将其符号链接
# 到已启用的站点/以启用它。
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
#  try_files $uri $uri/ =404;
# }
#}

学习一途,欲速则不达,真的当你完全弄懂这些配置中的符号的意思之后,你再看这些配置你的感觉是不一样的。当然我也是在一点一点的学习,我甚至装了个有图形化的Ubuntu虚拟机,为了研究nginx,这个默认生成的配置文件,我一开始是看不懂的,我也看了很长时间。😂😂😂

安装nginx没有生成各类目录文件问题解决

由于途中我需要手动安装一次,我就把使用apt安装的nginx给卸载了,并且把配置文件给删了,我再次使用apt安装时,发现不重新生成默认配置了。解决办法。依次执行。

sudo apt-get --purge remove nginx-common

sudo apt-get --purge remove nginx*

sudo apt-get autoremove

sudo apt install nginx

常用配置的介绍以及样例

侦听端口

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

访问日志

server {  
# Relative or full path to log file  
access_log /path/to/file.log;  
# Turn 'on' or 'off'    
access_log on;  
}  

域名


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

静态资产


server {  
listen 80;  
server_name yourdomain.com;  
location / {  
root /path/to/website;  
}  
}  

重定向

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

负载均衡

# []表示需要填写,
# 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

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 ""; 清空连接请求头
    }
}

控制浏览器缓存

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  #最大过期时间
    }
}

反向代理缓存

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

反向代理

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 协议

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打开,开码!!!

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  <title></title>
  <!-- 这里引入的JS放在nginx中也需要对应根目录存放一个 -->
  <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项目。开码!!!

/* 用来获取端口号项目运行的端口号,后面测试负载均衡时用到 */
@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请求返回项目运行端口号。

@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,这样前后台应该就能连通了。于是改了一下刷新页面,再次点击,还是不行。

报错信息:

已拦截跨源请求:同源策略禁止读取位于 http://localhost:8081/api/get 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。状态码:200。

火狐浏览器是这样提示的,别的浏览器可能会有些许的差别,但不重要,重要的是,我们的前后台并没有连通!!
这个时候我们需要配置反向代理了,来规避跨域的错误。

# 在配置文件的根目录中块,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

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

openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /usr/local/ssl/nginx.key -out /usr/local/ssl/nginx.crt

生成好了,一般我们直接强制https,只需要配置一个重定向即可。

完整的配置nginx.conf


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扛不住的那时候,首先应该考虑的是架构的问题了。得上微服务了。

原神和煦希望之风


Nginx详细配置
https://wangijun.com/2022/03/17/vue-05/
作者
无良芳
发布于
2022年3月17日
许可协议