nginx 配置文件详解以及调优

本贴最后更新于 1911 天前,其中的信息可能已经时移俗易

一、nginx 的安装部署

(1)使用 yum 源直接安装
yum install nginx -y

(2)源码编译安装
nginx 源码包下载官网地址:http://nginx.org/en/download.html

此处以新版本 nginx-1.17.7.tar.gz 为例,注意该版本不仅支持 http 七层代理,还支持 tcp 四层代理。

① 下载源码包并解压包

wget http://nginx.org/download/nginx-1.17.7.tar.gz && tar zxvf nginx-1.17.7.tar.gz && cd nginx-1.17.7

② 安装编译环境

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

③ 编译安装 nginx

./configure --prefix=/usr/local/nginx-1.17 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-threads

当然,如果需要其他模块,请自行添加其它模块参数,官网地址:http://nginx.org/en/docs/configure.html。

make && make install

# 二、配置文件优化

首先查看 nginx 配置文件的构成,如下:

... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 }

(1)全局块配置调优

# nginx进程数,建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数。 worker_processes 8; #为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; #收到新连接通知后接受尽可能多的连接,作用于event multi_accept on; #Nginx最多可以打开文件数,与ulimit -n保持一致,如:worker_rlimit_nofile 65535; worker_rlimit_nofile 65535;

(2)event 段调优配置

events { #作用于event的I/O多路复用模型 use epoll; #是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制 worker_connections 65535; #收到新连接通知后接受尽可能多的连接,作用于event multi_accept on; }

(3)http 全局段调优

http { include mime.types; default_type application/octet-stream; …… sendfile on; tcp_nopush on; …… **sendfile** :开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。 **tcp_nopush**:必须在sendfile开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量 **tcp_nodelay**:
  • 连接超时时间
    主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,如:
keepalive_timeout 60; keepalive_requests 10240; tcp_nodelay on; client_header_buffer_size 4k; open_file_cache max=102400 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 1; client_header_timeout 15; client_body_timeout 15; reset_timedout_connection on; send_timeout 15; server_tokens off; client_max_body_size 500m; proxy_connect_timeout 30s; proxy_send_timeout 120s; proxy_read_timeout 120s;

keepalived_timeout 60:客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
keepalive_requests 10240:参数限制了一个 HTTP 长连接最多可以处理完成的最大请求数, 默认是 100。当连接处理完成的请求数达到最大请求数后,将关闭连接。
tcp_nodelay:也是防止网络阻塞,不过要包涵在 keepalived 参数才有效
client_header_buffer_size 4k:客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于 1k,所以这里设置为分页大小。分页大小可以用命令 getconf PAGESIZE 取得。
**open_file_cache max=102400 inactive=20s**:这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
**open_file_cache_valid 30s**:这个是指多长时间检查一次缓存的有效信息。
**open_file_cache_min_uses 1**:open_file_cache 指令中的 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive 时间内一次没被使用,它将被移除。
**client_header_timeout**:设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx 将返回 request time out 的错误
**client_body_timeout**:设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示
**reset_timeout_connection**:告诉 nginx 关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
**send_timeout**:响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx 关闭连接
**server_tokens**:并不会让 nginx 执行的速度更快,但它可以关闭在错误页面中的 nginx 版本数字,这样对于安全性是有好处的。
**client_max_body_size**:上传文件大小限制
**proxy_connect_timeout**:与后端服务器建立连接的超时时间。注意这个一般不能大于 75 秒
**proxy_read_timeout**:从后端服务器读取响应的超时

  • gzip 调优
gzip on; gzip_min_length 2k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 6; gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml; gzip_vary on; gzip_proxied any; gzip_disable "MSIE [1-6].";

gzip on:开启压缩功能
gzip_min_length 1k:设置允许压缩的页面最小字节数,页面字节数从 header 头的 Content-Length 中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于 1K,如果小与 1K 可能会越压越大。
gzip_buffers 4 32k:压缩缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果。
gzip_http_version 1.1:压缩版本,用于设置识别 HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP 解压,使用默认即可
gzip_comp_level 6:压缩比例,用来指定 GZIP 压缩比,1 压缩比最小,处理速度最快,9 压缩比最大,传输速度快,但是处理慢,也比较消耗 CPU 资源。
gzip_types text/css text/xml application/javascript:用来指定压缩的类型,‘text/html’类型总是会被压缩。默认值: gzip_types text/html (默认不对 js/css 文件进行压缩)
gzip_vary on:varyheader 支持,改选项可以让前端的缓存服务器缓存经过 GZIP 压缩的页面,例如用 Squid 缓存经过 nginx 压缩的数据
gzip_disable:禁用 IE6 以下的 gzip 压缩,IE6 的某些版本对 gzip 的压缩支持很不好

  • 缓存设置
#设置缓存空间,存储缓存文件 proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h; #在location中使用缓存空间,pathname是项目的目录,请自定义 location /pathname { proxy_set_header X-Real-IP $remote_addr; proxy_cache nginx-cache; proxy_cache_valid 200 304 302 5d; proxy_cache_valid any 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost/pathname; } #打开文件的缓存配置 #为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。 open_file_cache max=65535 inactive=60s; #文件描述符一直是在缓存中打开的,如果有一个文件在inactive时间内一次没被使用,它将被移除。 open_file_cache_min_uses 1; #指定多长时间检查一次缓存的有效信息。 open_file_cache_valid 80s;
  • 访问限流调优
#限制用户连接数来预防DOS攻击 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; #限制同一客户端ip最大并发连接数 limit_conn perip 2; #限制同一server最大并发连接数 limit_conn perserver 20; #限制下载速度,根据自身服务器带宽配置 limit_rate 300k;
  • 正向代理
server { listen 8080; resolver 8.8.8.8; resolver_timeout 5s; proxy_connect; proxy_connect_allow 443 563; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; location / { proxy_pass $scheme://$host$request_uri; proxy_set_header Host $http_host; proxy_buffers 256 4k; proxy_max_temp_file_size 0; proxy_connect_timeout 30; } access_log /var/log/proxy/access.log main; error_log /var/log/proxy/error.log; }

配置终端代理

# 在 /etc/profile 文件中增加如下三项。 export proxy="http://{proxy_server_ip}:8080" export http_proxy=$proxy export https_proxy=$proxy # 使配置生效 source /etc/profile
  • 反向代理
location / { proxy_pass http://localhost:8088; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
  • 负载均衡
upstream myproject{ server 0.0.0.0:8082 fail_timeout=5 max_fails=3; server 0.0.0.0:8083 fail_timeout=5 max_fails=3; ip_hash; } location / { proxy_pass http://myproject; }
  • https 设置
    ① 下载证书
server { listen 80; server_name xxx.com; # rewrite ^(.*)$ https://$host$1 permanent; #把http的域名请求转成https server { listen 443; server_name xxx.com; # 你的域名 ssl on; # root /var/www/bjubi.com; #前台文件存放文件夹,可改成别的 # index index.html index.htm; #上面配置的文件夹里面的index.html ssl_certificate cert/xxx.com.crt; #改成你的证书的名字 ssl_certificate_key cert/xxx.com.key; #证书的名字 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
  • 配置文件完整版,供参考
worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; multi_accept on; worker_rlimit_nofile 65535; events { worker_connections 65535; multi_accept on; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"xff":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"agent":"$http_user_agent",' '"status":"$status"}'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60; keepalive_requests 10240; tcp_nodelay on; client_header_buffer_size 4k; open_file_cache max=102400 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 1; client_header_timeout 15; client_body_timeout 15; reset_timedout_connection on; send_timeout 15; server_tokens off; client_max_body_size 500m; proxy_connect_timeout 30s; proxy_send_timeout 120s; proxy_read_timeout 120s; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; limit_conn perip 2; limit_conn perserver 20; limit_rate 300k; proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 4; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; gzip_disable "MSIE [1-6]."; include /etc/nginx/conf.d/*.conf; } server { listen 443; server_name www.xxx.com; ssl on; ssl_certificate cert/证书名称.pem; ssl_certificate_key cert/证书名称.key; ssl_session_timeout 5m; # SSL协议配置 ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; valid_referers none blocked server_names *.ygoclub.com; #日志配置 access_log /var/log/nginx/access.log main gzip=4 flush=5m; error_log /var/log/nginx/error.log error; location ~ .*\.(eot|svg|ttf|woff|jpg|jpeg|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm) { proxy_cache nginx-cache; proxy_cache_valid 200 304 302 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; #所有静态文件直接读取硬盘 root /usr/share/nginx/html; expires 30d; #缓存30天 } location ~ .*\.(js|css)?$ { proxy_cache nginx-cache; proxy_cache_valid 200 304 302 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; #所有静态文件直接读取硬盘 root /usr/share/nginx/html; expires 12h; } location / { root /usr/share/nginx/html; index index.html index.htm; } location /druid { proxy_set_header X-Real-IP $remote_addr; proxy_cache nginx-cache; proxy_cache_valid 200 10m; proxy_pass http://xxxx/druid; } location /api { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://xxxx/api; } # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
  • 后续
    当然,nginx 调优好了,如果系统不进行优化,照样也是无用,以下对 linux 系统进行 tcp 方面的优化。
cat /etc/sysctl.conf net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 36768 net.core.somaxconn = 36768 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_keepalive_time = 30 net.core.wmem_default = 8588608 net.core.rmem_default = 8588608 net.core.rmem_max = 16877216 net.core.wmem_max = 16877216 net.ipv4.tcp_mem = 786432 2097152 3145728 net.ipv4.tcp_rmem = 32768 436600 16777216 net.ipv4.tcp_wmem = 8192 436600 16777216 net.ipv4.tcp_max_orphans = 3376800 net.ipv4.ip_local_port_range = 1024 65535 sysctl -p cat /etc/security/limit.conf * hard nofile 65535 * soft nofile 65535

net.ipv4.tcp_max_syn_backlog :表示 SYN 队列的长度,默认为 1024,加大队列长度为 8192,可以容纳更多等待连接的网络连接数。
net.core.netdev_max_backlog:表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值 128(可能不同的 linux 系统该数值也不同)。nginx 服务器中定义的 NGX_LISTEN_BACKLOG 默认为 511
net.core.somaxconn:表示 socket 监听(listen)的 backlog 上限
** net.ipv4.tcp_max_tw_buckets = 5000**:如果想把 timewait 降下了就要把 tcp_max_tw_buckets 值减小,默认是 180000
net.ipv4.tcp_keepalive_time:当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小时。我们可以调短时间跨度
**net.core.wmem_default **:默认的 TCP 数据发送窗口大小(字节)。
net.core.rmem_default:默认的 TCP 数据接收窗口大小(字节)。
**net.core.rmem_max **:最大的 TCP 数据接收窗口(字节)。
net.core.wmem_max:最大的 TCP 数据发送窗口(字节)。
**net.ipv4.tcp_tw_reuse **:开启重用功能,允许将 TIME-WAIT 状态的 sockets 重新用于新的 TCP 连接
net.ipv4.tcp_mem:意思是:net.ipv4.tcp_mem[0]:低于此值,TCP 没有内存压力.net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.net.ipv4.tcp_mem[2]:高于此值,TCP 拒绝分配 socket.上述内存单位是页,而不是字节
net.ipv4.tcp_wmem:TCP 写 buffer
net.ipv4.tcp_rmem:TCP 读 buffer
net.ipv4.tcp_max_orphans:系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的 DoS 攻击

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 215 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 489 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 176 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    226 引用 • 476 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3195 引用 • 8215 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 5 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 297 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    169 引用 • 1527 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 678 关注
  • Excel
    31 引用 • 28 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 15 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 297 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 416 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 176 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    366 引用 • 1842 回帖 • 1 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 2 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 254 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 384 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 7 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1278 回帖
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖