linux安装nginx
logrotate 是 Linux 系统中一个常用的日志管理工具,可以按照指定的规则自动对日志文件进行轮转、压缩和删除等操作。默认是安装到/usr/local/nginx,如果需要更改路径,替换/usr/local/nginx。外网访问是否正常:http://ip:80,如果外网访问不正常,可能是端口没有开发或者防火墙问题。使用which或者whereis,可能都找不到想要的结果,如下图所示。可通
linux安装nginx
一、下载
官网:https://nginx.org/en/download.html
二、安装依赖包
yum -y install make gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
三、上传压缩包并解压
将安装包nginx-1.28.0.tar.gz上传到/opt/nginx路径下并解压
mkdir /opt/nginx
cd /opt/nginx
tar -zxvf nginx-1.28.0.tar.gz
四、配置、编译和安装
默认是安装到/usr/local/nginx,如果需要更改路径,替换/usr/local/nginx
# 配置
cd /opt/nginx/nginx-1.28.0
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
# 编译和安装
make && make install
五、查看Nginx安装路径
whereis nginx
# 或者
which nginx
使用which或者whereis,可能都找不到想要的结果,如下图所示
使用组合命令查找
# 找到nginx对应的pid
ps -ef | grep nginx
# 查找nginx路径 ls -l /proc/pid(换成上面命令找到的pid)/exe
ls -l /proc/4688/exe
六、nginx命令
# 如果安装在其他目录,替换/usr/local/nginx
# 启动
/usr/local/nginx/sbin/nginx
# 停止
/usr/local/nginx/sbin/nginx -s stop
# 退出
/usr/local/nginx/sbin/nginx -s quit
# 重启
/usr/local/nginx/sbin/nginx -s reload
# 查看nginx.conf配置是否正确
/usr/local/nginx/sbin/nginx -t
# 查看nginx版本
/usr/local/nginx/sbin/nginx -V
# 直接使用nginx进行操作
# 第一种方式:创建软连接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
# 第二种方式:添加环境变量
# 编辑配置文件
vi /etc/profile
# 在文件末尾添加
export PATH=$PATH:/usr/local/nginx/sbin
# 使配置生效
source /etc/profile
# 就可以使用nginx操作了
nginx -V
非root用户启动会报错,非root用户没有使用80端口的权利
解决方式:
# 切换root用户
su - root
setcap 'cap_net_bind_service=+ep' /usr/local/nginx/sbin/nginx
七、测试Nginx是否启动成功
ps -ef | grep nginx
curl localhost:80

外网访问是否正常:http://ip:80,如果外网访问不正常,可能是端口没有开发或者防火墙问题
# 查看防火墙状态
systemctl status firewalld
# 暂时关闭防火墙
systemctl stop firewalld
# 永久关闭防火墙(慎用)
systemctl disable firewalld
# 开启防火墙
systemctl start firewalld
# 开放指定80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 关闭指定80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
八、systemd方式管理nginx
vi /etc/systemd/system/nginx.service
[Unit]
Description=The Nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
#PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 重载配置
systemctl daemon-reload
# 设置开机自启动
systemctl enable nginx
# 停止开机自启动
systemctl disable nginx
# 查看服务当前状态
systemctl status nginx
# 启动nginx服务
systemctl start nginx.service
# 停止nginx服务
systemctl stop nginx.service
# 重新启动服务
systemctl restart nginx.service
# 查看所有已启动的服务
systemctl list-units --type=service
九、nginx变量
- $body_bytes_sent:发送给客户端的响应体字节数(不包含响应头);
- $host:请求中的主机名(如example.com),优先使用请求行的主机名,否则使用 server_name;
- $hostname:Nginx服务运行所在主机的主机名;
- $http_cookie:客户端Cookie头;
- $http_HEADER:匹配请求报文中指定的HEADER;
- $http_host:匹配请求报文中的host首部;
- $http_referer:客户端Referer头(来源页面);
- $http_user_agent:客户端User-Agent头,如浏览器信息;
- $http_x_forwarded_for:用于获取客户端的真实 IP 地址。在经过代理服务器(如负载均衡器、CDN)转发的请求中,客户端的原始 IP 会被记录在 X-Forwarded-For 请求头中,而非 $remote_addr(它记录的是直接连接到 Nginx 的客户端或代理服务器的 IP);
- $remote_addr:客户端IP地址;
- $remote_port:客户端端口号;
- $remote_user:使用用户认证时客户端用户输入的用户名;
- $request:记录请求的URL和HTTP协议;
- $request_filename:用户请求中的URI经过本地root或alias转换后映射的本地文件路径;
- $request_id:唯一的请求标识符,用于跟踪请求;
- $request_method:请求方法,如GET、POST、PUT;
- $request_time: 请求处理时间(单位:秒,精确到毫秒);
- $request_uri:完整的请求URI,带参数;
- $scheme:请求协议,如http或https;
- $server_addr:服务器IP地址;
- $server_name:服务器名称;
- $server_port:服务器端口号;
- $server_protocol:请求协议版本,如http/1.1、http/1.0;
- $status:响应状态码,如200、404;
- $time_local:请求时间;
- $upstream_addr:上游服务器地址;
- $upstream_response_time:上游服务器响应时间(多个上游时用逗号分隔);
- $uri:当前请求的URI,不带参数;
十、http状态码
http状态码是用以表示网页服务器HTTP响应状态的3位数字代码。
可通过查看HTTP状态码来判断服务器状态,常见的有404、502等。
- 301:永久移动,被请求的资源已被永久移动位置;
- 302:请求的资源限制临时从不同的URI响应请求;
- 305:使用代理,被请求的资源必须通过指定的代理才能访问;
- 307:临时跳转,被请求的资源在临时从不同的URL响应请求;
- 400:错误请求;
- 402:需要付款,预留状态码,用于将来一些数字货币或者微支付;
- 403:禁止访问,服务器已理解请求,但拒绝执行它;
- 404:找不到对象,请求失败,资源不存在;
- 406:不可接受的,请求的资源内容特性无法满足请求头部中的条件,因而无法生成响应实体;
- 408:请求超时;
- 409:冲突,由于和被请求的资源的当前状态之间存在冲突,请求无法完成;
- 410:遗失的,被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址;
- 413:响应实体太大,服务器拒绝处理当前请求,请求超过服务器所能处理和允许的最大值;
- 417:期望失败。在请求头 Expect 中指定的预期内容无法被服务器满足;
- 418:我是一个茶壶。超文本咖啡罐控制协议,但是并没有被实际的HTTP服务器实现;
- 420:方法失效;
- 422:不可处理的实体。请求格式正确,但是由于含有语义错误,无法响应;
- 500:服务器内部错误。服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理;
- 502:请求后端失败;
- 504:请求成功,但是响应超时;
十一、白/黑名单配置
注意:IP同时出现在白名单和黑名单中,则以配置顺序为准,先匹配(顺序在前)的生效
第一种方式:直接配置在配置文件中:
# 白名单设置,allow后面为可访问的IP
location / {
# 允许单个IP访问
allow 192.168.1.1
# 允许一个IP段访问
allow 10.0.0.0/24
# 禁止所有其他IP访问
deny all;
}
# 白名单,特定目录访问限制
location /tree/list {
# 允许单个IP访问
allow 192.168.2.1
# 允许一个IP段访问
allow 10.0.0.0/24
# 禁止所有其他IP访问
deny all;
}
# 黑名单设置,deny后面为限制的IP
location / {
# 禁止单个IP访问
deny 192.168.1.2
# 禁止一个IP段访问
deny 192.168.2.0/24
# 允许所有其他IP访问,可以不写,默认开启
allow all;
}
第二种方式:读取文件IP配置
location / {
include /usr/local/nginx/whitelist.conf
}
cat /usr/local/nginx/whitelist.conf
# 允许单个IP访问
allow 192.168.1.1
# 允许一个IP段访问
allow 10.0.0.0/24
# 禁止所有其他IP访问
deny all;
十二、location路径匹配
匹配遵循以下顺序:
- 1.精确匹配(=);
- 2.前缀匹配(^~);
- 3.正则匹配(~ 或 *),按定义顺序;:区分大小写; ~*:不区分大小写;
- 4.普通前缀匹配(最长匹配);
location / {
return 200 "Default";
}
location /api/ {
return 200 "API";
}
location ^~ /api/private/ {
return 200 "Private";
}
访问 /api/private/test,结果返回 "Private",因为 ^~ 优先级高于 /api/
十三、日志
13.1 日志格式
# 访问日志access.log默认日志格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"
127.0.0.1 - - [09/Jan/2023:14:20:00 +0800] "POST /dkqz/api/findRegionDataList HTTP/1.1" 200 382426 "http://localhost/screen" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
$remote_addr--客户端的IP地址:127.0.0.1
$remote_user--认证用户名:第二个-
$time_local--请求时间:09/Jan/2023:14:20:00 +0800
$request--客户端的请求信息:POST /dkqz/api/findRegionDataList HTTP/1.1
$status--HTTP状态码:200
$body_bytes_sent--发送给客户端的响应体字节数:382426
$http_referer--请求的来源页面:http://localhost/screen
$http_user_agent--客户端的用户代理信息:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36
# 错误日志error.log:时间戳--日志级别--进程ID(nginx主进程ID#线程ID)--请求ID--错误信息--客户端IP--服务器--请求信息--上游地址--主机--来源页面
# 时间戳(YYYY/MM/DD HH:MM:SS):2023/02/06 15:41:37
# 日志级别:error
# 进程ID(nginx主进程ID#线程ID):10092#12592
# 请求ID:*573
# 错误信息:connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream
# 客户端IP:client: 127.0.0.1
# 服务器:server: localhost
# 请求信息:request: "POST /dkqz/api/screen/yhksyxz HTTP/1.1"
# 上游地址:upstream: "http://127.0.0.1:81/dkqz/api/screen/yhksyxz"
# 主机:host: "localhost"
# 来源页面:referrer: "http://localhost/screen"
2023/02/06 15:41:37 [error] 10092#12592: *573 connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "POST /dkqz/api/screen/yhksyxz HTTP/1.1", upstream: "http://127.0.0.1:81/dkqz/api/screen/yhksyxz", host: "localhost", referrer: "http://localhost/screen"
13.2 日志分割
13.2.1 使用logrotate工具
logrotate 是 Linux 系统中一个常用的日志管理工具,可以按照指定的规则自动对日志文件进行轮转、压缩和删除等操作
# 安装logrotate
yum install logrotate
# 创建一个新的 logrotate 配置文件,例如 /etc/logrotate.d/nginx
sudo vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 nobody nobody
dateext
dateformat -%Y%m%d
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
# 参数解释:
- `/usr/local/nginx/logs/*.log`:指定要处理的日志文件路径,这里表示处理 `/usr/local/nginx/logs/` 目录下所有的日志文件。
- `daily`:表示每天进行一次日志轮转。
- `missingok`:如果日志文件不存在,不报错继续执行。
- `rotate 30`:保留最近 30 个日志文件,旧的日志文件会被删除。
- `compress`:对轮转后的日志文件进行压缩(gzip格式)。
- `delaycompress`:延迟压缩上一次轮转的日志文件,即下一次轮转时才压缩上一次的文件。
- `notifempty`:如果日志文件为空,不进行轮转。
- `create 0640 nobody nobody`:轮转后创建新的日志文件,权限为 0640,所有者为 `nobody`,所属组为 `nobody`(通过ps -ef|grep nginx 查看 worker process 的运行用户)。
- `dateext`:切割后的文件添加日期作为后缀。
- `dateformat -%Y%m%d`:日期格式。
- `sharedscripts`:表示在所有日志文件轮转完成后只执行一次 `postrotate` 脚本。
- `postrotate` 和 `endscript`:在日志轮转完成后执行的脚本,这里通过 `kill -USR1` 信号通知 Nginx 重新打开日志文件,以便后续日志写入新文件。
# 测试 logrotate 是否正常工作:-d表示进行一次调试运行,不会修改任何文件,但会显示将要执行的操作
sudo logrotate -d /etc/logrotate.d/nginx
# 手动执行一次
sudo logrotate -vf /etc/logrotate.d/nginx
# 查看结果
ls -la /usr/local/nginx/logs/
# logrotate 通常会由系统的 cron 任务每天自动执行,可以查看 /etc/cron.daily/logrotate 文件来确认
cat /etc/cron.daily/logrotate
13.2.2 使用Shell脚本+Cron
# 创建脚本
sudo vim /opt/nginx/nginx-cut-log.sh
#!/bin/bash
#设置日志文件存放目录
LOG_PATH="/usr/local/nginx/logs"
YESTERDAY=$(date -d yesterday +"%d")
# 移动日志文件(重命名)
mv ${LOG_PATH}/access.log ${LOG_PATH}/access-${YESTERDAY}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error-${YESTERDAY}.log
# 通知nginx重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
# 清理 30 天前的日志
find ${LOG_PATH} -name "access_*.log" -type f -mtime +30 -exec rm -rf {} \;
find ${LOG_PATH} -name "error_*.log" -type f -mtime +30 -exec rm -rf {} \;
# 赋予脚本执行权限
sudo chmod +x /opt/nginx/nginx-cut-log.sh
# 设置cron定时任务
sudo crontab -e
0 0 * * * /bin/bash /opt/nginx/nginx-cut-log.sh
十四、openssl创建自签名证书
# 生成 CA 私钥(4096位,比 2048 位更安全)
openssl genrsa -out ca.key 4096
# 生成自签名根证书(有效期10年)
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=My-Root-CA"
# openssl req: 执行证书签名请求(CSR)的管理工具。
# -new: 创建一个新的请求。
# -x509: 关键参数。它告诉 OpenSSL 不要生成 CSR(请求文件),而是直接输出一个 自签名的证书(Self-Signed Certificate)。这通常用于创建根 CA。
# -days 3650: 证书有效期为 3650 天(大约 10 年)。
# -key ca.key: 使用刚才生成的私钥 ca.key 对这张证书进行签名。
# -out ca.crt: 生成的公钥证书文件名为 ca.crt。这个文件是公开的,你需要把它分发给客户端(如浏览器、Docker守护进程、操作系统)去信任它。
# -subj "...": 指定证书的主题信息(Subject),避免交互式输入,直接把信息填进去:
# /C=CN: Country,国家(中国)。
# /ST=Beijing: State/Province,省份(北京)。
# /L=Beijing: Locality,城市(北京)。
# /O=MyCompany: Organization,组织/公司名称(MyCompany)。
# /OU=com: Organizational Unit,部门(通常写 IT 或 com)。
# /CN=My-Root-CA: Common Name,通用名称。这是证书最重要的标识,通常是域名或主机名(这里叫 My-Root-CA)。
# 查看证书详细信息
openssl x509 -in ca.crt -text -noout
# 验证私钥和证书是否匹配,输出的 MD5 值应该相同
openssl x509 -noout -modulus -in ca.crt | openssl md5
openssl rsa -noout -modulus -in ca.key | openssl md5
十五、配置文件示例
# 运行用户(nobody、nginx、root等自定义用户)
#user nobody;
# 启动进程数,通常设置成和 CPU 核心数相等,或者设置为 auto 自动检测,具体数值则是启动对应数值的进程
worker_processes 1;
# 错误日志路径及级别:debug, info, notice, warn, error, crit
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 进程PID文件路径
#pid logs/nginx.pid;
events {
# 每个worker最大连接数,实际最大并发连接数 = worker_processes * worker_connections
worker_connections 2048;
# Linux高效事件模型,使用 epoll 模型
use epoll;
# 允许多个请求同时被接受
multi_accept on;
}
http {
# 引入 MIME 类型映射文件
include mime.types;
# 默认文件类型,如果无法识别文件类型,则默认下载
default_type application/octet-stream;
# 定义一个名为 'main' 的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$request_id" '
'time="$request_time, $upstream_response_time"';
# 访问日志路径,使用上面定义的 main 格式
access_log logs/access.log main;
# 隐藏 Nginx 版本号,防止黑客针对特定版本漏洞攻击
server_tokens off;
# 开启高效文件传输
sendfile on;
# 必须和 sendfile 配合使用,在一个数据包里发送所有头文件,减少网络报文数量
#tcp_nopush on;
# 开启 TCP_NODELAY,禁用 Nagle 算法,尽快发送数据,适用于小数据包高频发送
#tcp_nodelay on;
# 长连接超时时间 (单位:秒)
keepalive_timeout 65;
# 客户端上传文件大小限制 (默认 1m,上传大文件需修改)
client_max_body_size 100m;
# 开启 gzip 压缩,减少带宽占用,提高加载速度
gzip on;
# 无论是谁请求都压缩 (包括代理)
gzip_proxied any;
# 最小压缩文件大小,小于 1k 的文件不压缩 (压缩反而变大)
gzip_min_length 1k;
# 压缩缓冲区
#gzip_buffers 4 16k;
# 压缩级别 1-9,数字越大压缩越好但越占 CPU,建议设置在5左右
gzip_comp_level 6;
# 需要压缩的文件类型 (MIME type)
gzip_types text/plain application/javascript application/x-javascript text/css text/xml application/xml text/javascript application/json;
# 是否添加“Vary: Accept-Encoding”响应头
gzip_vary on;
# 禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable "MSIE [1-6]\.";
# 限速(每个IP,1次/秒,使用10M内存做配置存储)
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
# 限制同一个IP并发连接,使用10M内存做配置存储
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
# 定义一个后端服务器组,名为 web_server
upstream web_server {
# 负载均衡策略:
# 1. 轮询 (默认):按时间顺序逐一分配
# 2. weight:权重,默认为 1,权重越高分配的请求越多
# 3. ip_hash:每个请求按访问 IP 的 hash 结果分配,可解决 Session 共享问题
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080 weight=1;
# backup: 备份机,只有当其他所有非 backup 机器挂掉时才启用
server 192.168.1.103:8080 backup;
# down: 表示该机器暂时不参与负载
# server 192.168.1.104:8080 down;
}
# 正向代理服务器
# 注意:Nginx 原生仅支持 HTTP 正向代理,不支持 HTTPS (CONNECT 方法)
# 如果需要 HTTPS 正向代理,需要打补丁 ngx_http_proxy_connect_module
server {
listen 8080;
# DNS 解析配置
resolver 8.8.8.8 114.114.114.114 ipv6=off;
resolver_timeout 5s;
# 启用 CONNECT 方法(用于HTTPS代理)
#proxy_connect;
# 允许的端口
#proxy_connect_allow 443 563;
#proxy_connect_timeout 30;
#proxy_read_timeout 30;
#proxy_send_timeout 30;
# 使用文件配置,whitelist.conf和配置文件在同级目录下就可以不配置完整路径
include whitelist.conf
location / {
# 开启 proxy_pass,直接转发 $http_host 和 $request_uri
proxy_pass http://$http_host$request_uri;
# 设置允许代理
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
# web服务监听端口
listen 80;
# 服务器名称(域名)
server_name localhost;
# 使用文件配置,whitelist.conf和配置文件在同级目录下就可以不配置完整路径
include whitelist.conf
# 永久重定向到 https 站点
#return 301 https://$http_host$request_uri;
location / {
root html;
index index.html index.htm;
}
location /test {
client_max_body_size 15m;
# 增加头部ID
proxy_set_header X-Request-Id $request_id;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://web_server;
# 同一个IP允许瞬间突发5个请求,超过的请求就返回503
# burst=5:允许突发 5 个请求(缓冲队列)
# nodelay: 突发请求立即处理,不延迟
limit_req zone=req_zone burst=5 nodelay;
# 限制同一个IP并发数为5
limit_conn conn_zone 5;
}
}
server {
listen 443 ssl;
server_name localhost;
# SSL 证书文件路径
ssl_certificate cert/ca.crt;
ssl_certificate_key cert/ca.key;
# SSL 协议和加密套件优化 (推荐配置)
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 优先选择支持前向加密的算法,且按照性能的优先顺序排列
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE:!IDEA:!DES;
ssl_prefer_server_ciphers on;
# 指定TLS协议的版本,不安全的SSL2和SSL3要废弃掉
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# 使用文件配置,whitelist.conf和配置文件在同级目录下就可以不配置完整路径
include whitelist.conf
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;
location / {
root html;
index index.html index.htm;
}
location /test {
client_max_body_size 15m;
# 增加头部ID
proxy_set_header X-Request-Id $request_id;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 解决 https 重定时向回到了 http 的问题
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://web_server;
# 同一个IP允许瞬间突发5个请求,超过的请求就返回503
# burst=5:允许突发 5 个请求(缓冲队列)
# nodelay: 突发请求立即处理,不延迟
limit_req zone=req_zone burst=5 nodelay;
# 限制同一个IP并发数为5
limit_conn conn_zone 5;
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)