CentOS系统环境搭建(二十六)——使用nginx在无域名情况下使用免费证书设置https

news2025/2/9 7:06:58

centos系统环境搭建专栏🔗点击跳转

文章目录

  • 使用nginx在无域名情况下使用免费证书设置https
    • 1.获取SSL证书
      • 1.1 生成SSL密钥
      • 1.2 生成SSL证书
      • 1.3 重命名密钥文件
    • 2.nginx配置https
      • 2.1 放证书
      • 2.2 修改nginx.conf文件
        • 2.2.1 将80端口重定向到443
        • 2.2.2 端口443配置ssl证书
      • 2.3 启动nginx(这里有坑)
    • 3.一个不用域名用IP的坑

使用nginx在无域名情况下使用免费证书设置https

本文学习自大佬真心无著的博客如何在无域名的情况下使用nginx部署https站点,该博客的跳转链接为https://blog.csdn.net/yxjie2/article/details/126163577。以这篇博客的知识为基础,我将我的centos上的服务成功配置为使用https://124.221.87.224跳转进入,而且没有设置域名,SSL证书也是免费的。

image-20231225232857865

下面展开讲讲具体怎么做的。

1.获取SSL证书

1.1 生成SSL密钥

进入网站免费生成CSR文件,链接具体为https://csr.chinassl.net/generator-csr.html,输入如图内容。域名就填写IP地址即可,也可以设置真正的域名。

image-20231225233826928

然后点击按钮,生成CSR文件。将出现如下两个文本框,点击下载,以我的ip为例子,将获得文件124.221.87.224_csr.txt124.221.87.224_key.txt

image-20231225234056129

1.2 生成SSL证书

进入网站获取免费SSL证书,具体链接为https://csr.chinassl.net/free-ssl.html,将124.221.87.224_csr.txt上传,点击获取免费证书。

image-20231225234352321

然后下载证书文件即可。

image-20231225234507375

1.3 重命名密钥文件

将你的文件124.221.87.224_key.txt重命名为124.221.87.224.private

到此为之,免费的证书你已经拿到了,下面开始讲讲如何在nginx里完美配置这些证书。

2.nginx配置https

我当初安装nginx用的是CentOS系统环境搭建(十一)——CentOS7安装使用Nginx并部署前后端分离项目里面的内容。下面的配置都是这篇博客的延续。

2.1 放证书

将你下载获得的两个文件,124.221.87.224_ssl.crt124.221.87.224.private放置在服务器的文件夹/etc/ssl/下。

2.2 修改nginx.conf文件

我的配置文件是放在/usr/local/nginx/conf/里,这里一定要记得把你原本的nginx.conf文件备份一个,因为下面可能会失败,有大坑!

原本http下,我的配置文件是这样的。

# Nginx所属用户和用户组,这里配置的是nobody。由于Nginx并不会直接向客户端发送数据,只有在请求到达时才加入到Nginx的I/O处理队列中,所以Nginx只需要拥有访问目录的权限即可,无需高额权限
#user  nobody;                     

# 工作进程数,一般设置为系统CPU核心数。对于单核服务器来说,设置为1即可;对于多核服务器,可以设置成CPU核心数
worker_processes  2;               

# 定义错误日志文件路径。Nginx生产环境重要的调试信息将会记录在该文件中
#error_log  logs/error.log;        

#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 定义Nginx主进程的PID文件所在位置。若需要向Nginx主进程发送信号时,必须要知道这个进程的PID,因此需要记录到PID文件中
#pid        logs/nginx.pid;         

events {
	# 最大并发数。当同时有多个客户端访问Nginx时,每个访问者占据一个连接,当连接数到达该配置变量的值时,新的访问请求将会等待,直到空闲连接数不到该值再处理新的请求
    worker_connections  1024;      
}

http {
	 # 引入mime.types文件,它可以为不同的文件扩展名设定不同的MIME类型。Nginx不像Apache这样会根据文件扩展名自动推断文件类型,如果文件没有被正确识别MIME类型,就可能会出现浏览器无法正确解释的问题
    include       mime.types;     
	
	# 默认MIME类型,如果服务器无法识别它,那么就让浏览器自己来识别。当Nginx无法识别当前返回的MIME类型时,会采用该参数作为默认值
    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;
	
	# 开启高效文件传输,建议保持默认的开启状态。Nginx的高效文件传输技术可以让其更快地将文件内容传输到客户端,提高文件传输速度
    sendfile        on;     
	
	# 禁用TCP节点推送
	#tcp_nopush     on;
	
	#keepalive_timeout  0;
	# 客户端保持连接的时间,超时后断开连接。连接复用机制,当客户端发送完请求后,连接还会继续保持一段时间,以便快速发起下一次请求
    keepalive_timeout  65;  

	# 开启数据压缩功能
	#gzip  on;	

    server {
		# Nginx监听端口,当有请求到达该端口时,Nginx将会处理该请求。当客户端发送了请求过来后,Nginx会监听到该端口被占用,便会启用该server块去处理该请求
        listen       80;            
		
		# 指定服务端的域名/IP,如果没有域名,则使用IP地址。当Nginx接收到一个请求时,首先会按照请求中的Host(或X-Forwarded-Host)头信息的域名取匹配server_name指令中的值,只要匹配上即可
        server_name  localhost;    

		# 该行是将字符集设置为koi8-r,koi8-r是一种字符编码格式
		#charset koi8-r;
        # 设置字符集为 utf-8
        charset utf-8;

		# 该行是定义了当前这个server块的访问日志文件的存储位置。其中logs/host.access.log表示存储的目录和文件名,main表示使用标准的日志格式。如果该行没有被注释掉,就会在相应的目录下生成一份日志文件,记录该server块的访问日志
        #access_log  logs/host.access.log  main;

		# URL匹配规则。在Nginx中,URL匹配是由location指令提供的
        location / {                
			# 当URL中的路径为空时,会默认从这里找到对应的文件。该块内容的作用是指定处理该请求所使用的文件系统根目录路径
            root   /srv/tencent/page/dist;
            # try_files指令将尝试匹配请求的文件,如果找不到,则返回index.html
            try_files $uri $uri/ /index.html;
        }

        # 后端
        location /api/ {
            # 设置代理服务器发送的http请求头中Host的值为接收到的客户端请求头中的Host值
            proxy_set_header Host $http_host;
            # 设置代理服务器发送的http请求头中X-Real-IP的值为当前请求的客户端IP地址
            proxy_set_header X-Real-IP $remote_addr;
            # 设置代理服务器发送的http请求头中REMOTE-HOST的值为当前请求的客户端IP地址
            proxy_set_header REMOTE-HOST $remote_addr;
            # 设置代理服务器发送的http请求头中X-Forwarded-For的值为所有经过的代理服务器IP地址列表,多个IP地址之间用逗号隔开
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 将客户端请求通过代理服务器转发到指定地址
            proxy_pass http://127.0.0.1:8080/api/;
            # 设置代理服务器与后端服务器建立连接的超时时间
            proxy_connect_timeout 3600s;
            # 设置代理服务器从后端服务器读取数据的超时时间
            proxy_read_timeout  3600s;
            # 设置代理服务器向后端服务器发送数据的超时时间
            proxy_send_timeout  3600s;
        }

        location /python/ {
            # 设置代理服务器发送的http请求头中Host的值为接收到的客户端请求头中的Host值
            proxy_set_header Host $http_host;
            # 设置代理服务器发送的http请求头中X-Real-IP的值为当前请求的客户端IP地址
            proxy_set_header X-Real-IP $remote_addr;
            # 设置代理服务器发送的http请求头中REMOTE-HOST的值为当前请求的客户端IP地址
            proxy_set_header REMOTE-HOST $remote_addr;
            # 设置代理服务器发送的http请求头中X-Forwarded-For的值为所有经过的代理服务器IP地址列表,多个IP地址之间用逗号隔开
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # 将客户端请求通过代理服务器转发到指定地址
            proxy_pass http://127.0.0.1:8081/python/;
            # 设置代理服务器与后端服务器建立连接的超时时间
            proxy_connect_timeout 3600s;
            # 设置代理服务器从后端服务器读取数据的超时时间
            proxy_read_timeout  3600s;
            # 设置代理服务器向后端服务器发送数据的超时时间
            proxy_send_timeout  3600s;
        }

		# 配置 404 页面。当请求的文件不存在,或者因为某种原因无法访问到指定的文件时,返回404
        error_page  404              /404.html;  

		# 错误页面的配置,当出错时会跳转到该页面。当服务端返回错误状态码时,可以为不同的状态码指定不同的错误页面
        error_page   500 502 503 504  /50x.html;    

		# 当请求 URL 精确匹配 /50x.html 时,根据配置路径返回静态页面。配合error_page使用,可以为错误页面指定特定的URI
        location = /50x.html {        
            root   html;
        }

        # 将 PHP 脚本代理到监听在 127.0.0.1:80 的 Apache 服务器,或将 PHP 脚本代理到监听在 127.0.0.1:9000 的 FastCGI 服务器
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        #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;
        #}
    }

    # 另一个使用 IP、名称和端口的虚拟主机配置
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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

    # HTTPS 服务器
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

到了https下,我的配置文件是这样的。

# Nginx所属用户和用户组,这里配置的是nobody。由于Nginx并不会直接向客户端发送数据,只有在请求到达时才加入到Nginx的I/O处理队列中,所以Nginx只需要拥有访问目录的权限即可,无需高额权限
#user  nobody;                     

# 工作进程数,一般设置为系统CPU核心数。对于单核服务器来说,设置为1即可;对于多核服务器,可以设置成CPU核心数
worker_processes 2;

# 定义错误日志文件路径。Nginx生产环境重要的调试信息将会记录在该文件中
#error_log  logs/error.log;        

#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# 定义Nginx主进程的PID文件所在位置。若需要向Nginx主进程发送信号时,必须要知道这个进程的PID,因此需要记录到PID文件中
#pid        logs/nginx.pid;         

events {
	# 最大并发数。当同时有多个客户端访问Nginx时,每个访问者占据一个连接,当连接数到达该配置变量的值时,新的访问请求将会等待,直到空闲连接数不到该值再处理新的请求
	worker_connections 1024;
}

http {
	# 引入mime.types文件,它可以为不同的文件扩展名设定不同的MIME类型。Nginx不像Apache这样会根据文件扩展名自动推断文件类型,如果文件没有被正确识别MIME类型,就可能会出现浏览器无法正确解释的问题
	include mime.types;

	# 默认MIME类型,如果服务器无法识别它,那么就让浏览器自己来识别。当Nginx无法识别当前返回的MIME类型时,会采用该参数作为默认值
	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;

	# 开启高效文件传输,建议保持默认的开启状态。Nginx的高效文件传输技术可以让其更快地将文件内容传输到客户端,提高文件传输速度
	sendfile on;

	# 禁用TCP节点推送
	#tcp_nopush     on;

	#keepalive_timeout  0;
	# 客户端保持连接的时间,超时后断开连接。连接复用机制,当客户端发送完请求后,连接还会继续保持一段时间,以便快速发起下一次请求
	keepalive_timeout 65;

	# 开启数据压缩功能
	#gzip  on;	

	server {
		# Nginx监听端口,当有请求到达该端口时,Nginx将会处理该请求。当客户端发送了请求过来后,Nginx会监听到该端口被占用,便会启用该server块去处理该请求
		listen 80;

		# 指定服务端的域名/IP,如果没有域名,则使用IP地址。当Nginx接收到一个请求时,首先会按照请求中的Host(或X-Forwarded-Host)头信息的域名取匹配server_name指令中的值,只要匹配上即可
		server_name localhost;

		# 该行是将字符集设置为koi8-r,koi8-r是一种字符编码格式
		#charset koi8-r;
		# 设置字符集为 utf-8
		charset utf-8;

		#把http的域名请求转成https
		return 301 https://$host$request_uri;
	}

	# 另一个使用 IP、名称和端口的虚拟主机配置
	#
	#server {
	#    listen       8000;
	#    listen       somename:8080;
	#    server_name  somename  alias  another.alias;

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

	# HTTPS 服务器
	#
	server {
		listen 443 ssl;
		server_name localhost;

		# 证书
		ssl_certificate /etc/ssl/124.221.87.224_ssl.crt;
		# 秘钥存储路径
		ssl_certificate_key /etc/ssl/124.221.87.224.private;

		# ssl的一些配置
		ssl_session_cache shared:SSL:1m;
		ssl_session_timeout 5m;
		ssl_prefer_server_ciphers on;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		# 开启TLS协议
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

		# 该行是将字符集设置为koi8-r,koi8-r是一种字符编码格式
		#charset koi8-r;
		# 设置字符集为 utf-8
		charset utf-8;

		# 该行是定义了当前这个server块的访问日志文件的存储位置。其中logs/host.access.log表示存储的目录和文件名,main表示使用标准的日志格式。如果该行没有被注释掉,就会在相应的目录下生成一份日志文件,记录该server块的访问日志
		#access_log  logs/host.access.log  main;

		# URL匹配规则。在Nginx中,URL匹配是由location指令提供的
		location / {
			# 当URL中的路径为空时,会默认从这里找到对应的文件。该块内容的作用是指定处理该请求所使用的文件系统根目录路径
			root /srv/tencent/page/dist;
			# try_files指令将尝试匹配请求的文件,如果找不到,则返回index.html
			try_files $uri $uri/ /index.html;
		}

		# 后端
		location /api/ {
			# 设置代理服务器发送的http请求头中Host的值为接收到的客户端请求头中的Host值
			proxy_set_header Host $http_host;
			# 设置代理服务器发送的http请求头中X-Real-IP的值为当前请求的客户端IP地址
			proxy_set_header X-Real-IP $remote_addr;
			# 设置代理服务器发送的http请求头中REMOTE-HOST的值为当前请求的客户端IP地址
			proxy_set_header REMOTE-HOST $remote_addr;
			# 设置代理服务器发送的http请求头中X-Forwarded-For的值为所有经过的代理服务器IP地址列表,多个IP地址之间用逗号隔开
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			# 将客户端请求通过代理服务器转发到指定地址
			proxy_pass http://127.0.0.1:8080/api/;
			# 设置代理服务器与后端服务器建立连接的超时时间
			proxy_connect_timeout 3600s;
			# 设置代理服务器从后端服务器读取数据的超时时间
			proxy_read_timeout 3600s;
			# 设置代理服务器向后端服务器发送数据的超时时间
			proxy_send_timeout 3600s;
		}

		location /python/ {
			# 设置代理服务器发送的http请求头中Host的值为接收到的客户端请求头中的Host值
			proxy_set_header Host $http_host;
			# 设置代理服务器发送的http请求头中X-Real-IP的值为当前请求的客户端IP地址
			proxy_set_header X-Real-IP $remote_addr;
			# 设置代理服务器发送的http请求头中REMOTE-HOST的值为当前请求的客户端IP地址
			proxy_set_header REMOTE-HOST $remote_addr;
			# 设置代理服务器发送的http请求头中X-Forwarded-For的值为所有经过的代理服务器IP地址列表,多个IP地址之间用逗号隔开
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			# 将客户端请求通过代理服务器转发到指定地址
			proxy_pass http://127.0.0.1:8081/python/;
			# 设置代理服务器与后端服务器建立连接的超时时间
			proxy_connect_timeout 3600s;
			# 设置代理服务器从后端服务器读取数据的超时时间
			proxy_read_timeout 3600s;
			# 设置代理服务器向后端服务器发送数据的超时时间
			proxy_send_timeout 3600s;
		}

		# 配置 404 页面。当请求的文件不存在,或者因为某种原因无法访问到指定的文件时,返回404
		error_page 404 /404.html;

		# 错误页面的配置,当出错时会跳转到该页面。当服务端返回错误状态码时,可以为不同的状态码指定不同的错误页面
		error_page 500 502 503 504 /50x.html;

		# 当请求 URL 精确匹配 /50x.html 时,根据配置路径返回静态页面。配合error_page使用,可以为错误页面指定特定的URI
		location = /50x.html {
			root html;
		}
	}
}

观察可知。我将原本server80里面的跳转配置原封不动的照搬进了server443里,但是有几个地方特别注意,需要改。下面讲讲我做了什么。

2.2.1 将80端口重定向到443

把原来80里面的跳转配置都删掉,然后配置关键在return 301 https://$host$request_uri;

	server {
		# Nginx监听端口,当有请求到达该端口时,Nginx将会处理该请求。当客户端发送了请求过来后,Nginx会监听到该端口被占用,便会启用该server块去处理该请求
		listen 80;

		# 指定服务端的域名/IP,如果没有域名,则使用IP地址。当Nginx接收到一个请求时,首先会按照请求中的Host(或X-Forwarded-Host)头信息的域名取匹配server_name指令中的值,只要匹配上即可
		server_name localhost;

		# 该行是将字符集设置为koi8-r,koi8-r是一种字符编码格式
		#charset koi8-r;
		# 设置字符集为 utf-8
		charset utf-8;

		#把http的域名请求转成https
		return 301 https://$host$request_uri;
	}
2.2.2 端口443配置ssl证书
	server {
		listen 443 ssl;
		server_name localhost;

		# 证书
		ssl_certificate /etc/ssl/124.221.87.224_ssl.crt;
		# 秘钥存储路径
		ssl_certificate_key /etc/ssl/124.221.87.224.private;

		# ssl的一些配置
		ssl_session_cache shared:SSL:1m;
		ssl_session_timeout 5m;
		ssl_prefer_server_ciphers on;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		# 开启TLS协议
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		-----------这下面照搬原来80的配置-------------------
	}

2.3 启动nginx(这里有坑)

替换掉nginx.conf后,进入文件夹/usr/local/nginx/sbin下,执行验证配置文件是否正确的命令。

./nginx -t

如果你没有报错,那太赞了,那你这一块不用看了,但是我这里爆了一个错😭。

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf

这里的原因是我最开始安装nginx的时候,可以看下博客CentOS系统环境搭建(十一)——CentOS7安装使用Nginx并部署前后端分离项目,用的命令如下。

./configure

😭这就埋坑了啊!这样安装的nginx是没有http_ssl_module模块的,不支持ssl,所以才导致了报错。

这时候,把你原本的nginx.conf,就是以前http那个的换回去,然后在文件夹/usr/local/nginx/sbin下执行命令先把服务器上的nginx停掉(不换回去执行命令也停不掉)。

./nginx -s stop

记得在你本地备份一下http的nginx.conf文件和https的nginx.conf文件,然后我要卸载nginx。

rm -rf /usr/local/nginx

然后我们重新安装nginx。将原文CentOS系统环境搭建(十一)——CentOS7安装使用Nginx并部署前后端分离项目的./configure换成下面这个命令。其他步骤不用变。

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module

安装完成后,再将你https的nginx.conf文件放回去,用./nginx -t再试试,我成功了。

成功后,在文件夹/usr/local/nginx/sbin下执行命令重启nginx即可。

./nginx -s reload

到此,nginx对https的配置支持已经完成。

3.一个不用域名用IP的坑

当我高兴的开始把http://124.221.87.224改成https://124.221.87.224往里面点击的时候,却发现浏览器控制台报错Mixed Content: The page at https://* was loaded over HTTPS, but requested an insecure XMLHttpReque,然后我发现除了页面是正常的,后端接口没一个通的。这里要怎么解决呢?

很简单,去你的index主页,我这里原本是<meta http-equiv="X-UA-Compatible" content="IE=edge">,请换成如下标签。

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"/>

image-20231226002142253

image-20231226002408191

讲解一下,出现Mixed Content: The page at https://* was loaded over HTTPS, but requested an insecure XMLHttpReque是因为浏览器的安全机制,https协议的网站请求http协议的资源被浏览器认为不安全,请求被拦截。然后使用<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"/>会自动将HTTP请求升级成安全的HTTPS请求。这就是它可以解决这个问题的原因。

我在网上搜索的时候,看到说如果你用的是真正的域名,就不会有这个错了,但是我用的只有一个ip,是不是这样呢?我没域名,所以也实验不了,各位网友有域名的可以试试,看看会不会避开这个坑。

至此,我成功的将我的服务器的主页,http://124.221.87.224升级成了https://124.221.87.224。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1335879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu18设置开机自启动

项目需求&#xff1a;机器人开机上电后工控机首先运行机械臂控制代码&#xff0c;再运行算法代码 1.终端执行以下代码 gnome-session-properties 2.设置开机自启动选项 在弹出界面点击添加&#xff0c;名称随便填&#xff0c;命令填入要启动的脚本&#xff0c;注释随便填。 …

sigmoid softmax优化

1.前言 最近在搞模型部署发现&#xff0c;推理速度不能满足我们需求&#xff0c;于是最近学习了优化算子技巧&#xff0c;学到了sigmoid&#xff0c;softmax算子优化&#xff0c;真的数学之美。2.sigmoid算子优化 一.算子优化图 我们根据sigmoid公式&#xff0c;我们进行求反…

C语言字符串处理提取时间(ffmpeg返回的时间字符串)

【1】需求 需求&#xff1a;有一个 “00:01:33.90” 这样格式的时间字符串&#xff0c;需要将这个字符串的时间值提取打印出来&#xff08;提取时、分、秒、毫秒&#xff09;。 这个时间字符串从哪里来的&#xff1f; 是ffmpeg返回的时间&#xff0c;也就是视频的总时间。 下…

Java之Atomic 原子类总结

Java之Atomic 原子类总结 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思。在化学上&#xff0c;我们知道原子是构成一般物质的最小单位&#xff0c;在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一…

TypeScript学习(进阶篇)

一、元组 数组合并了相同类型的对象&#xff0c;而元组&#xff08;Tuple&#xff09;合并了不同类型的对象。 元组起源于函数编程语言&#xff08;如 F#&#xff09;&#xff0c;这些语言中会频繁使用元组。 简单的例子 定义一对值分别为 string 和 number 的元组&#xf…

计算机视觉基础(13)——深度估计

前言 本节是计算机视觉的最后一节&#xff0c;我们将学习深度估计。从深度的概念和度量入手&#xff0c;依次学习单目深度估计和双目/多目深度估计&#xff0c;需要知道深度估计的经典方法&#xff0c;掌握深度估计的评价标准&#xff0c;注意结合对极几何进行分析和思考。 一、…

成为小leader后,最大的感受就是:领导真的更偏爱主动汇报的下属!

* 你好&#xff0c;我是前端队长&#xff0c;在职场&#xff0c;玩副业&#xff0c;文末有福利! 有些朋友在职场&#xff0c;可能会陷入一个误区&#xff0c;觉得我们的付出&#xff0c;领导都能看到。这就大错特错了&#xff0c;很简单&#xff0c;打个比方&#xff0c;你有10…

申请虚拟VISA卡Pokepay 教程来了

官网地址https://www.pokepay.cc/ ​​​​​ 填写邮箱地址 填写邀请码116780 会有20USD开卡优惠券 限时几天活动

网络安全法规和模型

基础 ISO信息安全&#xff1a;为数据处理系统建立和采取技术、管理的安全保护&#xff0c;保护计算机硬件、软件、数据不因偶然的或恶意的原因而受到破坏、更改、泄露 信息安全属性&#xff1a; CIA三元组&#xff1a;保密性、完整性、可用性 其他属性&#xff1a;真实性、不…

微短剧,会成为长视频的“救命稻草”吗?

职场社畜秒变霸道总裁&#xff0c;普通女孩穿越成为艳丽皇妃.......这样“狗血”的微短剧&#xff0c;最近不仅在国内各大视频平台上异常火爆&#xff0c;而且还直接火出了国外。 所谓微短剧&#xff0c;就是单集时长从几十秒到十几分钟的剧集&#xff0c;有着相对明确的主题和…

Android 手机对于Arduino蓝牙控制解决方案

1、Android系统概述 ​ Android 系统是 Google 公司基于 Linux 内核开发的移动端操作系统,适用于智能手机智能手表平板电脑等设备&#xff0c;最新的版本为 7.1。Android系统具有免费开源的优势,任何企业与个人都可以查阅公开的 API 文档&#xff0c;并在自己开发的应用中通过调…

【Gitlab】CICD流水线自动化部署教程

第一步&#xff0c;准备 GitLab 仓库 这个不用多说&#xff0c;得先保证你的项目已经托管在一个 GitLab 仓库中。 第二步&#xff0c;定义 .gitlab-ci.yml 文件 在你的项目根目录中创建一个 .gitlab-ci.yml 文件。这个文件将定义所有 CI/CD 的工作流程&#xff0c;包括构建、测…

IPC之十:使用共享文件进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;常用的 IPC 方式有管道、消息队列、共享内存等&#xff0c;但其实使用广大程序员都熟悉的文件也是可以完成 IPC 的&#xff0c;本文介绍如何使用共享文件实现进程间通信&#xff0c;本文给出了具体的实…

基于电商场景的高并发RocketMQ实战-Commitlog基于内存的高并发写入优化、基于JVM offheap的内存读写分离机制

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

linux:下载、网络请求、端口

一&#xff1a;ping命令 可以通过ping命令,检查指定的网络服务器是否是可联通状态 语法: ping [-c num] ip或主机名 1、选项&#xff1a;-c,检查的次数&#xff0c;不使用-c选项&#xff0c;将无限次数持续检查 2、参数&#xff1a;ip或主机名&#xff0c;被检查的服务器的…

NET中使用SQLSugar操作sqlserver数据库

目录 一、SqlSugar是什么&#xff1f; 二、迁移和建表 1.建立实体 2.创建上下文类 3.在Program中添加SqlSugar服务 4.在控制器中注入上下文类 三、简单实现CURD功能 总结 一、SqlSugar是什么&#xff1f; SqlSugar是一款老牌 .NET 开源ORM框架。 主要特点&#xff1a…

天啦撸 超级麻烦的MySQL索引和数据引擎,快拿小本本记好

1 MySQL的索引 1.1 索引 定义&#xff1a; 索引是一个排序的列表&#xff0c;包含索引字段的值和其对应的行记录的数据所在的物理地址 ●索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过…

边缘计算AI智能盒子的视频源必须是固定点监控摄像头吗?

边缘计算AI盒子的视频输入源&#xff0c;要求是RTSP或者GB28181&#xff0c;可以是固定点监控摄像头&#xff08;枪机、球机等&#xff09;&#xff0c;也可以是移动摄像头&#xff0c;例如执法记录仪、智能安全帽、布控球等&#xff0c;但由于RTSP输入要求摄像头有固定IP&…

贪吃蛇小游戏的代码实现之知识点铺垫篇

今天给大家介绍一个很经典的小游戏&#xff0c;它和扫雷在经典小游戏这方面可以说是旗鼓相当&#xff0c;它的名字就是贪吃蛇。贪吃蛇游戏最初为单机模式&#xff0c;后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。该游戏具体玩法是&#xff1a;用游戏把子上下左右控…

redis复习笔记01(小滴课堂)

高并发的必备两大“核技术”队列和缓存 介绍本地缓存和分布式缓存 Nosql介绍和Reidis介绍 Linux服务器源码安装Redis6和相关依赖 在路径下上传压缩包。 上传压缩包。 版本更新了&#xff0c;但这是临时的。 版本更新了。 解压压缩包&#xff1a; 重命名&#xff1a; 我们可以看…