{"id":33280,"date":"2023-02-23T02:52:42","date_gmt":"2023-07-27T03:55:04","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/"},"modified":"2024-04-29T15:51:38","modified_gmt":"2024-04-29T07:51:38","slug":"%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/","title":{"rendered":"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631"},"content":{"rendered":"<p>\u6211\u539f\u672c\u8ba4\u4e3a\u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u7b2c\u4e03\u5929\u7684\u5e16\u5b50\uff0c\u4f46\u662f\u7b2c\u4e8c\u5341\u4e8c\u5929\u662f\u7a7a\u7684\uff0c\u6240\u4ee5\u6211\u642c\u4e86\u8fc7\u6765\u3002@udzura<\/p>\n<p>\u5f53\u4f7f\u7528ngx_mruby\u5bf9\u547d\u4ee4\u8fdb\u884c\u542f\u52a8\u5e76\u542f\u52a8\u5b88\u62a4\u8fdb\u7a0b\u65f6\uff0c\u53ef\u4ee5\u5f02\u6b65\u8fdb\u884c\uff0c\u8fd9\u662f\u975e\u5e38\u65b9\u4fbf\u7684\u3002\u7136\u800c\uff0c\u5982\u679c\u4f7f\u7528Kernel#system\u65b9\u6cd5\u8fdb\u884c\u542f\u52a8\uff0c\u53ef\u80fd\u4f1a\u9047\u5230\u4e00\u4e9b\u9677\u9631\uff0c\u56e0\u6b64\u6211\u5c06\u4ecb\u7ecd\u4e00\u4e0b\u8fd9\u4e2a\u95ee\u9898\uff0c\u5e76\u4ecb\u7ecd\u4e00\u4e2a\u540d\u4e3amruby-clean-spwan\u7684mgem\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<h2>\u5c1d\u8bd5\u4f7f\u7528Nginx\u521b\u5efa\u5b88\u62a4\u8fdb\u7a0b\u3002 (I will try to create a daemon using Nginx.)<\/h2>\n<p>\u8fd9\u662f\u4e00\u4e2a\u76f8\u5f53\u4e13\u4e1a\u7684\u7528\u9014\uff0c\u9996\u5148\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4ee5\u4e0b\u7684Ruby\u811a\u672c\u6765\u521b\u5efa\u4e00\u4e2a\u5b88\u62a4\u8fdb\u7a0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">#!\/usr\/bin\/ruby<\/span>\r\n<span class=\"no\">Process<\/span><span class=\"p\">.<\/span><span class=\"nf\">daemon<\/span>\r\n\r\n<span class=\"nb\">require<\/span> <span class=\"s1\">'logger'<\/span>\r\n<span class=\"n\">fd<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"\/tmp\/test.log.<\/span><span class=\"si\">#{<\/span><span class=\"vg\">$$<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"kp\">loop<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"n\">fd<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span> <span class=\"s2\">\"Test!! <\/span><span class=\"si\">#{<\/span><span class=\"no\">Time<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nb\">sleep<\/span> <span class=\"mi\">1<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>ngx_mruby \u7684\u914d\u7f6e\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">server<\/span> {\r\n  <span class=\"n\">listen<\/span>      <span class=\"m\">80<\/span> <span class=\"n\">default_server<\/span>;\r\n  <span class=\"n\">server_name<\/span> *.<span class=\"n\">example<\/span>.<span class=\"n\">com<\/span>;\r\n  <span class=\"n\">location<\/span> \/ {\r\n    <span class=\"n\">mruby_content_handler<\/span> \/<span class=\"n\">var<\/span>\/<span class=\"n\">lib<\/span>\/<span class=\"n\">mruby<\/span>\/<span class=\"n\">hook<\/span>.<span class=\"n\">rb<\/span>;\r\n  }\r\n}\r\n<\/code><\/pre>\n<p>Fox Script \u662f\u8fd9\u6837\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">unless<\/span> <span class=\"nb\">system<\/span> <span class=\"s2\">\"\/bin\/sh -c \/usr\/local\/bin\/daemon.rb\"<\/span>\r\n  <span class=\"no\">Nginx<\/span><span class=\"p\">.<\/span><span class=\"nf\">rputs<\/span> <span class=\"s1\">'{\"status\": \"FAILURE\"}'<\/span>\r\n<span class=\"k\">else<\/span>\r\n  <span class=\"no\">Nginx<\/span><span class=\"p\">.<\/span><span class=\"nf\">rputs<\/span> <span class=\"s1\">'{\"status\": \"OK\"}'<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u4e2a\u72b6\u6001\u4e0b\u5c1d\u8bd5\u4f7f\u7528curl\u786e\u5b9e\u53ef\u4ee5\u770b\u5230\u67d0\u79cd\u5b88\u62a4\u7a0b\u5e8f\u6b63\u5728\u8fd0\u884c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> curl <span class=\"nt\">-s<\/span> localhost | jq <span class=\"nb\">.<\/span>\r\n<span class=\"go\">{\r\n  \"status\": \"OK\"\r\n}\r\n<\/span><span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> ps auxf\r\n<span class=\"c\">...\r\n<\/span><span class=\"go\">nginx     15206  0.0  0.1  37176  1296 ?        Ss   09:55   0:00 nginx: master process \/usr\/sbin\/nginx -c \/etc\/nginx\/nginx.conf\r\nnginx     15207  0.0  0.3  37600  4028 ?        S    09:55   0:00  \\_ nginx: worker process\r\nnginx     15218  0.0  0.7  40548  7272 ?        Sl   09:55   0:00 \/usr\/bin\/ruby \/usr\/local\/bin\/daemon.rb\r\n<\/span><\/code><\/pre>\n<h2>\u770b\u8d77\u6765\u5f88\u4e0d\u9519\uff0c\u4f46\u662f&#8230;<\/h2>\n<p>\u8fd9\u4e2a\u5b88\u62a4\u8fdb\u7a0b\u76f4\u63a5\u7ee7\u627f\u4e86 Nginx \u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u96c6\u3002 fd0 ~ fd2 \u5f53\u7136\u4f1a\u91cd\u65b0\u6253\u5f00\uff0c\u56e0\u4e3a\u5b83\u4eec\u662f\u5b88\u62a4\u8fdb\u7a0b\u7684\uff0c\u4f46\u5176\u4ed6\u7684\u5c31\u662f\u76f4\u63a5\u4f7f\u7528 Nginx \u7684\u539f\u6837&#8230;\u3002<\/p>\n<pre class=\"post-pre\"><code>ubuntu@ubuntu-zesty:~$ sudo ls -l \/proc\/15218\/fd\r\ntotal 0\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 0 -&gt; \/dev\/null\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 1 -&gt; \/dev\/null\r\nl-wx------ 1 nginx nginx 64 Dec 22 09:58 10 -&gt; pipe:[48162]\r\nl-wx------ 1 nginx nginx 64 Dec 22 09:58 11 -&gt; \/tmp\/test.log.15218\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 2 -&gt; \/dev\/null\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 3 -&gt; socket:[48154]\r\nlr-x------ 1 nginx nginx 64 Dec 22 09:58 4 -&gt; pipe:[48161]\r\nl-wx------ 1 nginx nginx 64 Dec 22 09:58 5 -&gt; pipe:[48161]\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 6 -&gt; socket:[46974]\r\nlr-x------ 1 nginx nginx 64 Dec 22 09:58 7 -&gt; pipe:[48162]\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 8 -&gt; anon_inode:[eventpoll]\r\nlrwx------ 1 nginx nginx 64 Dec 22 09:58 9 -&gt; anon_inode:[eventfd]\r\n<\/code><\/pre>\n<p>mruby\u7684Kernel#system\u76f4\u63a5\u4f7f\u7528\u4e86system(3)\u51fd\u6570\uff0c\u4f46\u662f\u5b83\u5e76\u6ca1\u6709\u5f88\u597d\u5730\u5904\u7406\u4e00\u4e9b\u540e\u7eed\u64cd\u4f5c\u3002\u5982\u679c\u539f\u59cb\u8fdb\u7a0b\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u88ab\u7ee7\u627f\uff0c\u5b50\u8fdb\u7a0b\u7684\u5904\u7406\u53ef\u80fd\u4f1a\u5b58\u5728\u98ce\u9669\u3002<\/p>\n<h2>\u63d0\u4f9b close-on-exec \u529f\u80fd\u7684\u5e72\u51c0\u751f\u6210\u3002<\/h2>\n<p>\u6240\u4ee5\uff0c\u6211\u4eec\u5c1d\u8bd5\u4f7f\u7528clean_spawn\u8fdb\u884c\u91cd\u5199\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">unless<\/span> <span class=\"n\">clean_spawn<\/span> <span class=\"s2\">\"\/bin\/sh\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"-c\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"\/usr\/local\/bin\/daemon.rb\"<\/span>\r\n  <span class=\"no\">Nginx<\/span><span class=\"p\">.<\/span><span class=\"nf\">rputs<\/span> <span class=\"s1\">'{\"status\": \"FAILURE\"}'<\/span>\r\n<span class=\"k\">else<\/span>\r\n  <span class=\"no\">Nginx<\/span><span class=\"p\">.<\/span><span class=\"nf\">rputs<\/span> <span class=\"s1\">'{\"status\": \"OK\"}'<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u4ece\u8fd9\u4e2a\u94a9\u5b50\u8d77\u52a8\u7684\u5b88\u62a4\u8fdb\u7a0b\u53ef\u4ee5\u770b\u51fafd\u7684\u72b6\u6001\u5df2\u7ecf\u53d1\u751f\u4e86\u53d8\u5316\u3002<\/p>\n<pre class=\"post-pre\"><code>nginx     15271  0.0  0.7  40504  7428 ?        Sl   10:02   0:00 \/usr\/bin\/ruby \/usr\/local\/bin\/daemon.rb\r\nubuntu@ubuntu-zesty:~$ sudo ls -l \/proc\/15271\/fd\r\ntotal 0\r\nlrwx------ 1 nginx nginx 64 Dec 22 10:02 0 -&gt; \/dev\/null\r\nlrwx------ 1 nginx nginx 64 Dec 22 10:02 1 -&gt; \/dev\/null\r\nlrwx------ 1 nginx nginx 64 Dec 22 10:02 2 -&gt; \/dev\/null\r\nlr-x------ 1 nginx nginx 64 Dec 22 10:02 3 -&gt; pipe:[48379]\r\nl-wx------ 1 nginx nginx 64 Dec 22 10:02 4 -&gt; pipe:[48379]\r\nlr-x------ 1 nginx nginx 64 Dec 22 10:02 5 -&gt; pipe:[48380]\r\nl-wx------ 1 nginx nginx 64 Dec 22 10:02 6 -&gt; pipe:[48380]\r\nl-wx------ 1 nginx nginx 64 Dec 22 10:02 7 -&gt; \/tmp\/test.log.15271\r\n<\/code><\/pre>\n<p>\u8fd9\u4e9b\u7ba1\u90533\u52306\u662f\u7531CRuby\u521b\u5efa\u7684\uff0c7\u662f\u5728\u811a\u672c\u5185\u90e8\u6253\u5f00\u7684\u4f5c\u4e3a\u65e5\u5fd7\u6587\u4ef6\u7684\u3002\u8fd9\u610f\u5473\u7740\u4e0d\u518d\u6709\u6765\u81eaNginx\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u3002<\/p>\n<p>\u5728clean_spawn\u51fd\u6570\u5185\u90e8\uff0c\u66f4\u5177\u4f53\u5730\u8bf4\uff0c<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">fork\u3092\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u65e2\u5b58\u306efile descriptor\u306b\u5168\u3066 close-on-exec \u30d5\u30e9\u30b0\u3092\u7acb\u3066\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">exec\u3092\u3059\u308b<\/ul>\n<p>\u6211\u4f1a\u4ed4\u7ec6\u5730\u505a\u8fd9\u4ef6\u4e8b\u3002<\/p>\n<h2>\u66f4\u8fdb\u4e00\u6b65\u7684\u9677\u9631 de<\/h2>\n<p>\u4e0d\u8fc7\uff0c\u5728\u8fd9\u91cc\u8fd8\u6709\u4e00\u4e2a\u9677\u9631\uff0c\u5c31\u662f\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u91cd\u65b0\u542f\u52a8Nginx\uff0c\u8fd9\u4e2a\u5b88\u62a4\u8fdb\u7a0b\u5c31\u4f1a\u5b8c\u5168\u6d88\u5931&#8230;\u3002<\/p>\n<pre class=\"post-pre\"><code>ubuntu@ubuntu-zesty:~$ sudo systemctl restart nginx                                                                                               \r\nubuntu@ubuntu-zesty:~$ ps auxf | grep ruby\r\nubuntu   15298  0.0  0.1  12960  1028 pts\/0    S+   10:06   0:00              \\_ grep --color=auto ruby\r\n<\/code><\/pre>\n<p>\u8c01\u5728\u8fdb\u884c\u6740\u6b7b\u64cd\u4f5c\u5462\uff1f\u901a\u8fc7\u4f7f\u7528gdb\u53ef\u4ee5\u8ffd\u8e2a\uff0c\u6240\u4ee5\u6211\u5c06\u8fdb\u884c\u9644\u52a0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">nginx     15360  0.0  0.7  40580  7592 ?        Sl   10:07   0:00 \/usr\/bin\/ruby \/usr\/local\/bin\/daemon.rb                                           \r\n<\/span><span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> <span class=\"nb\">sudo <\/span>gdb <span class=\"nt\">-p<\/span> 15360                                 \r\n<span class=\"go\">GNU gdb (Ubuntu 7.12.50.20170314-0ubuntu1.1) 7.12.50.20170314-git        \r\nCopyright (C) 2017 Free Software Foundation, Inc.                        \r\n<\/span><span class=\"gp\">License GPLv3+: GNU GPL version 3 or later &lt;http:\/\/gnu.org\/licenses\/gpl.html&gt;<\/span>                                                                     \r\n<span class=\"go\">This is free software: you are free to change and redistribute it.       \r\nThere is NO WARRANTY, to the extent permitted by law.  Type \"show copying\"                                                                        \r\nand \"show warranty\" for details.    \r\nThis GDB was configured as \"x86_64-linux-gnu\".                           \r\nType \"show configuration\" for configuration details.                     \r\nFor bug reporting instructions, please see:                              \r\n<\/span><span class=\"gp\">&lt;http:\/\/www.gnu.org\/software\/gdb\/bugs\/&gt;<\/span><span class=\"nb\">.<\/span>                                 \r\n<span class=\"go\">Find the GDB manual and other documentation resources online at:         \r\n<\/span><span class=\"gp\">&lt;http:\/\/www.gnu.org\/software\/gdb\/documentation\/&gt;<\/span><span class=\"nb\">.<\/span>                        \r\n<span class=\"go\">For help, type \"help\".              \r\nType \"apropos word\" to search for commands related to \"word\".            \r\nAttaching to process 15360          \r\n[New LWP 15362]                     \r\n[Thread debugging using libthread_db enabled]                            \r\nUsing host libthread_db library \"\/lib\/x86_64-linux-gnu\/libthread_db.so.1\".                                                                        \r\npthread_cond_timedwait@@GLIBC_2.3.2 () at ..\/sysdeps\/unix\/sysv\/linux\/x86_64\/pthread_cond_timedwait.S:225                                          \r\n225     ..\/sysdeps\/unix\/sysv\/linux\/x86_64\/pthread_cond_timedwait.S: No such file or directory.                                                    \r\n(gdb) c                             \r\nContinuing.                         \r\n<\/span><\/code><\/pre>\n<p>\u5728\u8fd9\u79cd\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4ece\u53e6\u4e00\u4e2a\u7ec8\u7aef\u8fd0\u884c\u3010systemctl restart nginx\u3011\u5c31\u4f1a&#8230; \u6211\u53d1\u73b0\u8fd9\u662f\u7531SIGTERM\u4fe1\u53f7\uff0cPID\u4e3a1\u5373\u6765\u81easystemd\u53d1\u9001\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code>Thread 2 \"ruby-timer-thr\" received signal SIGTERM, Terminated.           \r\n[Switching to Thread 0x7f7fef5d7700 (LWP 15362)]                         \r\n0x00007f7feec6cd8d in poll () at ..\/sysdeps\/unix\/syscall-template.S:84   \r\n84      ..\/sysdeps\/unix\/syscall-template.S: No such file or directory.   \r\n(gdb) ptype $_siginfo               \r\ntype = struct {\r\n    int si_signo;\r\n    int si_errno;\r\n    int si_code;\r\n    union {\r\n        int _pad __attribute__ ((vector_size(28)));\r\n        struct {...} _kill;\r\n        struct {...} _timer;\r\n        struct {...} _rt;\r\n        struct {...} _sigchld;\r\n        struct {...} _sigfault;\r\n        struct {...} _sigpoll;\r\n    } _sifields;\r\n}\r\n(gdb) p $_siginfo._sifields._sigchld.si_pid\r\n$1 = 1 &lt;- !!!\r\n<\/code><\/pre>\n<p>\u8fd9\u662f\u4ec0\u4e48\u610f\u601d\u5462\uff1f\u5b9e\u9645\u4e0a\uff0c\u8fd9\u662f\u7531\u4e8e\u5b88\u62a4\u8fdb\u7a0b\u7684cgroup\u4e0e\u539f\u59cb\u7684nginx\u670d\u52a1\u7684cgroup\u662f\u76f8\u540c\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">nginx     15703  0.0  0.1  37176  1296 ?        Ss   10:12   0:00 nginx: master process \/usr\/sbin\/nginx -c \/etc\/nginx\/nginx.conf\r\nnginx     15705  0.0  0.3  37600  3972 ?        S    10:12   0:00  \\_ nginx: worker process\r\nnginx     15718  0.0  0.7  40488  7340 ?        Sl   10:14   0:00 \/usr\/bin\/ruby \/usr\/local\/bin\/daemon.rb\r\n<\/span><span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> <span class=\"nb\">sudo grep <\/span>systemd \/proc\/15703\/cgroup \r\n<span class=\"go\">1:name=systemd:\/system.slice\/nginx.service\r\n<\/span><span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> <span class=\"nb\">sudo grep <\/span>systemd \/proc\/15718\/cgroup \r\n<span class=\"go\">1:name=systemd:\/system.slice\/nginx.service\r\n<\/span><\/code><\/pre>\n<p>systemd\u5728\u91cd\u542f\u65f6\u5f15\u7528\u4e86\u8fd9\u4e2asystemd\u5b50\u7cfb\u7edf\u3002\u5bf9\u4e8e\u4e0d\u662f\u76f4\u63a5\u7531Unit\u6587\u4ef6\u7ba1\u7406\u7684\u8fdb\u7a0b\uff0csystemd\u4f1a\u5411\u6240\u5c5e\u7ec4\u4e2d\u7684\u8fdb\u7a0b\u53d1\u9001SIGTERM -&gt; SIGKILL\u7684\u4fe1\u53f7\u987a\u5e8f\u3002\u8bf7\u53c2\u8003\u7b2c29\u5f20\u3002<\/p>\n<h2>\u4fee\u6539cgroup\u7684systemd\u7ec4\u3002<\/h2>\n<p>\u6240\u4ee5\uff0cclean_spawn\u6709\u4e00\u4e2a\u9009\u9879\uff0c\u7528\u4e8e\u79fb\u52a8\u5b88\u62a4\u8fdb\u7a0b\u7684cgroup\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"no\">CleanSpawn<\/span><span class=\"p\">.<\/span><span class=\"nf\">cgroup_root_path<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"\/sys\/fs\/cgroup\/systemd\"<\/span>\r\n<span class=\"k\">unless<\/span> <span class=\"n\">clean_spawn<\/span> <span class=\"s2\">\"\/bin\/sh\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"-c\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"\/usr\/local\/bin\/daemon.rb\"<\/span>\r\n  <span class=\"no\">Nginx<\/span><span class=\"p\">.<\/span><span class=\"nf\">rputs<\/span> <span class=\"s1\">'{\"status\": \"FAILURE\"}'<\/span>\r\n<span class=\"k\">else<\/span>\r\n  <span class=\"no\">Nginx<\/span><span class=\"p\">.<\/span><span class=\"nf\">rputs<\/span> <span class=\"s1\">'{\"status\": \"OK\"}'<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u76ee\u524d\uff0c\u5982\u679cNginx\u6ca1\u6709\u4ee5root\u8eab\u4efd\u542f\u52a8\uff0c\u5219\u6b64\u9009\u9879\u65e0\u6cd5\u6b63\u5e38\u5de5\u4f5c\u3002<\/p>\n<p>\u5982\u679c\u5c06\u5176\u8bbe\u7f6e\u4e3a\u8fd9\u6837\uff0c\u91cd\u65b0\u542f\u52a8Nginx\u65f6\u5c31\u4e0d\u4f1a\u5f71\u54cd\u5b88\u62a4\u8fdb\u7a0b\u3002\u771f\u662f\u592a\u597d\u4e86&#8230;<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> <span class=\"nb\">sudo <\/span>systemctl restart nginx          \r\n<span class=\"gp\">ubuntu@ubuntu-zesty:~$<\/span> ps auxf | <span class=\"nb\">grep <\/span>ruby\r\n<span class=\"go\">ubuntu   15820  0.0  0.0  12960   936 pts\/0    S+   10:18   0:00  |           \\_ grep --color=auto ruby\r\nroot     15789  0.0  0.7  40500  7356 ?        Sl   10:17   0:00 \/usr\/bin\/ruby \/usr\/local\/bin\/daemon.rb\r\n<\/span><\/code><\/pre>\n<hr \/>\n<p>\u6211\u4ecb\u7ecd\u4e86\u7528\u4e8engx_mruby\u7684\u4e13\u95e8\u5904\u7406\u7684mgem\u3002<\/p>\n<p>\u6211\u60f3\u505a\u7684\u4e8b\u60c5\u96d6\u7136\u6709\u9ede\u72c2\u71b1\uff0c\u4f46\u901a\u904e\u9019\u500b\u904e\u7a0b\u6211\u7372\u5f97\u4e86Linux\/UNIX\u76f8\u7576\u91cd\u8981\u7684\u77e5\u8b58\uff0c\u6240\u4ee5\u6211\u5beb\u4e86\u4e0b\u4f86\u3002\u5c31\u662f\u4eca\u5929\u9019\u6a23\u5b50&#8230;\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u539f\u672c\u8ba4\u4e3a\u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u7b2c\u4e03\u5929\u7684\u5e16\u5b50\uff0c\u4f46\u662f\u7b2c\u4e8c\u5341\u4e8c\u5929\u662f\u7a7a\u7684\uff0c\u6240\u4ee5\u6211\u642c\u4e86\u8fc7\u6765\u3002@udzura \u5f53\u4f7f\u7528ngx_mru [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-33280","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5173\u4e8e\u4ece-ngx_mruby-\u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631\" \/>\n<meta property=\"og:description\" content=\"\u6211\u539f\u672c\u8ba4\u4e3a\u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u7b2c\u4e03\u5929\u7684\u5e16\u5b50\uff0c\u4f46\u662f\u7b2c\u4e8c\u5341\u4e8c\u5929\u662f\u7a7a\u7684\uff0c\u6240\u4ee5\u6211\u642c\u4e86\u8fc7\u6765\u3002@udzura \u5f53\u4f7f\u7528ngx_mru [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5173\u4e8e\u4ece-ngx_mruby-\u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-27T03:55:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T07:51:38+00:00\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/\",\"name\":\"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-27T03:55:04+00:00\",\"dateModified\":\"2024-04-29T07:51:38+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5173\u4e8e\u4ece-ngx_mruby-\u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631","og_description":"\u6211\u539f\u672c\u8ba4\u4e3a\u8fd9\u662f\u4e00\u4e2a\u5173\u4e8e\u7b2c\u4e03\u5929\u7684\u5e16\u5b50\uff0c\u4f46\u662f\u7b2c\u4e8c\u5341\u4e8c\u5929\u662f\u7a7a\u7684\uff0c\u6240\u4ee5\u6211\u642c\u4e86\u8fc7\u6765\u3002@udzura \u5f53\u4f7f\u7528ngx_mru [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5173\u4e8e\u4ece-ngx_mruby-\u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-27T03:55:04+00:00","article_modified_time":"2024-04-29T07:51:38+00:00","author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/","name":"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-27T03:55:04+00:00","dateModified":"2024-04-29T07:51:38+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5173\u4e8e\u4ece ngx_mruby \u542f\u52a8\u5b88\u62a4\u7a0b\u5e8f\u65f6\u7684\u9677\u9631"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%85%b3%e4%ba%8e%e4%bb%8e-ngx_mruby-%e5%90%af%e5%8a%a8%e5%ae%88%e6%8a%a4%e7%a8%8b%e5%ba%8f%e6%97%b6%e7%9a%84%e9%99%b7%e9%98%b1\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=33280"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33280\/revisions"}],"predecessor-version":[{"id":86205,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/33280\/revisions\/86205"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=33280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=33280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=33280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}