V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  n0099  ›  全部回复第 8 页 / 共 9 页
回复总数  168
1  2  3  4  5  6  7  8  9  
2023 年 1 月 12 日
回复了 bronana 创建的主题 NGINX 想请教大家 nginx 如何判断 server_name
首先 if is evil https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
我想阁下现在遇到的问题是请求任何`非`列出来的这些子域时(例如`curl -I `Host: example.com` -v http://您的服务端 IP`)仍然会匹配这个 block 导致进入`return 301 https://$host$request_uri`
如果您所有的 nginx.conf 文件中只有这一个 server block 那么文档 http://nginx.org/en/docs/http/request_processing.html 对此早有预言
> If its value does not match any server name, or the request does not contain this header field at all, then nginx will route the request to the default server for this port. In the configuration above, the default server is the first one — which is nginx’s standard default behaviour

要想在 80 和 443 上搭建正确的 default http(s) server 您可以参考 https://serverfault.com/questions/847978/best-practice-to-handle-default-server-and-public-ip-in-nginx
一个常见错误是只设置了 port80 的 default server ,导致使用 http 或 https 协议请求 443 (或其他)端口时仍然会绕过 default server (因为 default 是针对单个 listen 端口的)
http://nginx.org/en/docs/http/ngx_http_core_module.html#listen 进一步指出:
> The default_server parameter, if present, will cause the server to become the default server for the specified address:port pair. If none of the directives have the default_server parameter then the first server with the address:port pair will be the default server for this pair.

```nginx
server {
listen 80 fastopen=256 default_server;
listen 443 fastopen=256 ssl default_server;
server_name _ "";
access_log path/to/log/default.access.log;
error_log path/to/log/default.error.log;

ssl_certificate /etc/nginx/snippets/self-signed-ssl.crt; # 使用 openssl 生成的自签名证书 https://stackoverflow.com/questions/10175812/how-to-generate-a-self-signed-ssl-certificate-using-openssl
ssl_certificate_key /etc/nginx/snippets/self-signed-ssl.key;

return 444; # https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return The non-standard code 444 closes a connection without sending a response header. https://www.reddit.com/r/Network/comments/e8aveo/nginx_explain_http_444_like_im_five/
}
2023 年 1 月 12 日
回复了 mmnsghgn 创建的主题 信息安全 请帮忙测试这个帖子中的 XSS 是否有效
2023 年 1 月 11 日
回复了 Jamy 创建的主题 Linux 如何给 sh -c "echo $1,$2" 传递参数。
@webcape233 估计他复制粘贴来的 bash 里有一大堆的$1 $2 $3 $4 $5 $6 $7 $8 $9 他懒得查找替换,而您又不可能声明 1=a ( bash 变量名不能数字开头)
2023 年 1 月 11 日
回复了 Jamy 创建的主题 Linux 如何给 sh -c "echo $1,$2" 传递参数。
https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c
第一个回答的机翻:

/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
在第一种情况下,显式传递 echo 参数$0 和$1 ,在第二种情况下,使用"$@"to 正常扩展为“除 $0 之外的所有位置参数”。请注意,在这种情况下,我们也必须传递一些要使用的东西$0 ;我选择了“bash”,因为这$0 通常是什么,但其他任何东西都可以。

至于这样做的原因,而不是仅仅将您直接提供的任何参数传递给您列出的命令:请注意文档说“命令是从字符串中读取的”,复数形式。换句话说,这个方案允许你做:

/bin/bash -c 'mkdir -p -- "$1" && cd -P -- "$1" && touch -- "$2"' bash dir file
2023 年 1 月 11 日
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
@biguokang 建议深入学习贯彻泛银河系格雷科技分部邪恶组织四叶重工炼铜本部叶独头子叶独群组联合体陈意志第三帝国元首炼铜傻狗橙猫领导下的四叶 TG 本部( https://t.me/n0099_tg https://t.me/n0099official )话语体系文风:
https://sora.ink/archives/1574
https://github.com/n0099/TiebaMonitor/issues/24
https://github.com/Starry-OvO/aiotieba/issues/64
2023 年 1 月 11 日
回复了 shendaowu 创建的主题 MySQL 如何防止大量耗时的数据库查询影响网页加载速度?
2023 年 1 月 11 日
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
#8 @shendaowu 通过控制进程的资源用量使得您也可以在一个系统上跑两个 mysqld
#10 @lululau 很明显他只是装个现有的程序来跑所以无法修改其内部结构 https://www.v2ex.com/t/908246
2023 年 1 月 11 日
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
可以基于#6 所说的单独开个 mysqld 进程作为只读 replicate 服务端
然后修改`innodb_buffer_pool_size`( https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size )和`innodb_redo_log_capacity`/`innodb_log_file_size`以约束进程常驻占用内存量: https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html#innodb-modifying-redo-log-capacity
根据每个 sql 的特点可能会产生巨大的临时表( https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html ),您可以把默认 1G 的`temptable_max_ram`也调低 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram
限制进程硬盘 io: https://unix.stackexchange.com/questions/48138/how-to-throttle-per-process-i-o-to-a-max-limit
限制进程 cpu 使用率: https://manpages.ubuntu.com/manpages/trusty/man1/cpulimit.1.html
2023 年 1 月 11 日
回复了 GGGG430 创建的主题 MySQL sql 中包含特殊字符问题
另外如果您要导入的这个几百 m 的文件是合法的 csv (但您说`包含很多 mysql 保留字或者其他特殊字符,那大概率也有一大堆的,`),那您可以试试 LOAD DATA INFILE https://dev.mysql.com/doc/refman/8.0/en/load-data.html
2023 年 1 月 11 日
回复了 GGGG430 创建的主题 MySQL sql 中包含特殊字符问题
难道您还在手动拼接 raw sql ?要是这几百 m 的字符串里正好有个`; DROP DATABASE 您的库名;`呢?
2023 年 1 月 11 日
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
那就直接把 event loop 视作 FIFO stack
https://i.imgur.com/6v8EAF1.png
您每次 setTimeout/Interval 或创建 Promise (不论 new 还是 Promise.reslove/reject())都是 push 了一个回调进 stack
等您导致 push tsack 的这些同步 js 代码都执行完了之后 js 主线程空闲时就会去 pop stack 取出回调来逐个执行
这也不需要去阅读理解有关 spec html.spec.whatwg.org/multipage/webappapis.html#task-queue 中的 micro/marcotask 概念 stackoverflow.com/questions/25915634/difference-between-microtask-and-macrotask-within-an-event-loop-context
请不要在每一个回复中都包括外链,这看起来像是在 spamming
2023 年 1 月 11 日
回复了 jaredyam 创建的主题 Java 这段随机数生成代码为什么这么写?
2023 年 1 月 11 日
回复了 n0099 创建的主题 程序员 如何从理论上避免这类并行任务交错执行时的冲突问题
> 但不论 UPSERT 还是 IGNORE 都是从数据库层面缓解问题,他不是保证永不发生 DUPLICATE 错误

如果要从数据库层面解决可以尝试
7.`SELECT ... FOR UPDATE`语法所产生的`插入意向排他锁`
---
https://i.imgur.com/sH4wlWZ.png
线程 1 和 2 每次 SELECT 时都通过 WHERE 子句(只取 field=a 的行)缩小了`FOR UPDATE`所造成的[IX 锁]( https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_intention_exclusive_lock)的范围(不然没有 WHERE 我怀疑会锁全表,也就是类似于[`LOCK TABLES ... WRITE`]( https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html))
线程 2 在执行后必须无限期(直到达到[innodb_lock_wait_timeout]( https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout))等待线程 1`COMMIT`,因为线程 2 想要 SELECT 的行`field=a`已于此前被线程 1 设置 IX 锁
不难看出此时进程范围的全局锁(进程锁)已经没有存在的必要了,因为他的目的跟 IX 锁是类似的(但他无法目前像 IX 锁那样无限期阻塞任何试图读取进程锁的线程)
实际上 IX 锁同样降低了并行度,因为这跟原文中提出的`1.延后线程 2 查询数据库的时机`是类似的目的:
都是将任何试图读取某些行(`IX 锁`是 field=a 的行,`1.延后线程 2`是所有行,也就是回到了`LOCK TABLES`)的线程挂起直至正在写入某些行的其他线程`COMMIT`
也就是说两者都是试图通过[serialize]( https://en.wikipedia.org/wiki/Serializability)最开始读行的过程从而避免后续`INSERT`时冲突

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-intention-locks
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-insert-intention-locks
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
https://stackoverflow.com/questions/21261213/select-for-update-with-insert-into
https://stackoverflow.com/questions/10935850/when-to-use-select-for-update

但人生自古谁无死,不幸地,截止 2022 年 11 月发布的最新版本`EFCore 7`,我所使用的.NET 企业级 ORM `Entity Framework Core`中仍未引入任何原生的 IQueryable<T> linq2sql operator 使得其可以被翻译为追加在`SELECT`末尾的`FOR UPDATE`: https://github.com/dotnet/efcore/issues/26042#issuecomment-993534289
目前能用的变通只有额外查询 rawsql 来表示 IX 锁(而不能直接嵌入已有的 linq2sql 中): https://stackoverflow.com/questions/37984312/how-to-implement-select-for-update-in-ef-core
2023 年 1 月 11 日
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
> 要把 js 引擎和浏览器分开来,js 引擎负责解析 js 代码,浏览器才是最终真正干活的东西,这两者不是一体的。

分开理解 v8 和 chromium 最简单的方式就是去用 njs ,njs 环境下有浏览器 api 吗?您能在 njs 里去操作根本不存在的 dom 吗?

> 当 js 引擎执行完所有的同步代码之后,你可以理解为 js 引擎唯一的工作就是,等浏览器踢一脚去执行队列里对应的回调函数。

setTimeout 是在往 loop 追加了一个应该在未来执行的 task ,而`delay: 0`参数只是意味着 loop 应该挂起这个 task 等到 0ms 后再执行( 0ms 也就是不等待)
但不论是传入 setTimeout 还是 Promise.reslove 的回调都是在未来才会发生的,所以才必须等到 console.log(1 和 3)两个同步调用都执行完(也就是整个`console.log(1) setTimeout console.log(3)`)后才会再去执行 loop 中已有的应该在未来执行的 task (在这里就是 setTimeout 的回调 console.log(2))

> js 引擎是单线程的,本身也没有计时、网络请求之类的功能,他的任务也只是把活交给浏览器去干。相对于的 nodejs 也一样。

准确地说是 v8 解释器解释执行 js 时是跑在一个 os thread 内部的
2023 年 1 月 11 日
回复了 hemingyang 创建的主题 Oracle 请问 SQL 跟新大量数据怎么处理快呢?
看看 EXPLAIN SELECT tcz.KCXZ FROM T_J20230106 tcz WHERE T.ID=tcz.ID AND T.KCXZ!=tcz.KCXZ 是不是 full table scan
2023 年 1 月 11 日
回复了 PrilgrimLi 创建的主题 Google google maps 定位不准
2023 年 1 月 11 日
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#19 @biguokang
> 是 js 代码通过调用浏览器 web api 从而调用 c++的过程,表面上你写的是 js 代码,但最后实际上干活的是 c++,这个道理放在 nodejs 也同理。

实际上`干活的`涉及许多层级,chromium 的 cpp 代码实际上也是调包特定 os 提供的各种异步 io api 和 syscall ,渲染同理(如果涉及硬件加速还需要通过 ogl/dx 间接的让显卡驱动去跟更多的硬件通信)

> 踢了一下 js 引擎,说我活干完了,你可以执行任务等待队列里的对应回调函数了。

这就是 event loop/message queue

#20 @autoxbc > OP 混淆了 JS 线程和 JS 引擎线程,JS 是单线程,引擎执行完下载,后续代码自然需要回到 JS 线程继续。JS 编码应该保持 JS 视角,只观察引擎提供的接口,不关心引擎实现的细节

js 目前的主流解释器 v8 引擎只是一个 js 解释器,他同样不负责浏览器层面的那些网络请求 ui 渲染等任务
2023 年 1 月 11 日
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#18 @yezheyu
> 所以 xhr 只是负责和浏览器的网络线程通信,下发任务

xhr/fetch 是浏览器暴露的一套 api ,以允许您去指挥网络线程发起 http request
然而很明显在一个单纯的`<img src="url">`中不存在任何`<script>`中的 js 代码去通过 xhr/fetch api 请求这个 url
因此在这里实际上只有 html parser 在请求图片 url ,而后 network thread 再把 url 的 response body 传输给渲染图片的 thread ,还有可能导致 css reflow
建议复习
https://www.chromium.org/developers/design-documents/displaying-a-web-page-in-chrome/
https://www.chromium.org/developers/design-documents/multi-process-architecture/
https://www.chromium.org/developers/design-documents/multi-process-resource-loading/
https://chromium.googlesource.com/chromium/src/+/master/docs/how_cc_works.md

> 对于下载好的资源,你怎么处理,就算只是打印一下,也必须让主线程处理。

如果阁下所说的`打印一下`是指`console.log(await(await fetch('https://www.v2ex.com')).text())`这样的 js 代码,那么 network thread 当然会把 response body 传回给 js thread 从而作为您所调用的的`Response.text()`返回的 promise 的 reslove 值

> 对于结果不管是更新 UI ,还是打印结果,都只能是主线程处理

但如果您没有在 js 中消费这个 Response 对象那不会有任何 byte[]被从 network thread 传输到您的 js thread 上,例如`console.log(await fetch('https://www.v2ex.com'))`
而对于最开始的例子 一个单纯的`<img src="url">` 这里同样没有任何 js 的存在,即上文所说的:
> 要么是其他浏览器 thread 消费,比如有一个`<img src="url">`,那么 network thread 下载完了`url`后就会把 byte[]传给负责图片渲染和 css layout 的 thread ,让他们绘制这个<img>,这里同样没有 js 的事(即便您禁用了浏览器 js 也不会妨碍<img src>正常工作)
回顾经典之
https://officechai.com/news/developer-asks-javascript-question-twitter-javascript-founder-steps-help/
https://twitter.com/BrendanEich/status/818570098998800388

另外 php 创始人 Rasmus Lerdorf 并不懂现代 php 生态圈,如 https://news.ycombinator.com/item?id=1044280 https://news.ycombinator.com/item?id=6919248
您不如去致电在 jetbrains 任职开发 phpstorm 时( php7~php8 时代)为 php-src 做出大量贡献的 Nikita Popov
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5894 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 02:20 · PVG 10:20 · LAX 18:20 · JFK 21:20
♥ Do have faith in what you're doing.