<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>clousky2020 (李文强)</title>
    <link>https://ruby-china.org/clousky2020</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>redis 编译安装和 systemd 配置</title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;公司迁移服务器，目标是 redhat 的系统，记录下过程&lt;/p&gt;
&lt;h2 id="安装过程"&gt;安装过程&lt;/h2&gt;&lt;h3 id="下载"&gt;下载&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://redis.io/download" rel="nofollow" target="_blank"&gt;https://redis.io/download&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@localhost ~]# yum install wget
[root@localhost ~]# wget http://download.redis.io/releases/redis-6.0.5.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="解压并编译安装"&gt;解压并编译安装&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar -zxvf redis-6.0.5.tar.gz
cd redis-6.0.5

# 编译 并指定安装目录
make PREFIX=/usr/local/redis6.0.5 install
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="make 错误"&gt;make 错误&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;In file included from server.c:30:0:
server.h:1045:5: error: expected specifier-qualifier-list before ‘_Atomic’
     _Atomic unsigned int lruclock; /* Clock for LRU eviction */
     ^
server.c: In function ‘serverLogRaw’:
server.c:1028:31: error: ‘struct redisServer’ has no member named ‘logfile’
     int log_to_stdout = server.logfile[0] == '\0';
                               ^
server.c:1031:23: error: ‘struct redisServer’ has no member named ‘verbosity’
     if (level &amp;lt; server.verbosity) return;
                       ^
server.c:1033:47: error: ‘struct redisServer’ has no member named ‘logfile’
     fp = log_to_stdout ? stdout : fopen(server.logfile,"a");
                                               ^
server.c:1046:47: error: ‘struct redisServer’ has no member named ‘timezone’
         nolocks_localtime(&amp;amp;tm,tv.tv_sec,server.timezone,server.daylight_active);
                                               ^
server.c:1046:63: error: ‘struct redisServer’ has no member named ‘daylight_active’
         nolocks_localtime(&amp;amp;tm,tv.tv_sec,server.timezone,server.daylight_active);
                                                               ^
server.c:1049:19: error: ‘struct redisServer’ has no member named ‘sentinel_mode’
         if (server.sentinel_mode) {
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="解决问题"&gt;解决问题&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 查看gcc版本是否在5.3以上，centos7.6默认安装4.8.5
gcc -v

# 升级gcc到5.3及以上,如下升级到gcc 9.3：
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash

# 需要注意的是scl命令启用只是临时的，退出shell或重启就会恢复原系统gcc版本。

#如果要长期使用gcc 9.3的话：
echo "source /opt/rh/devtoolset-9/enable" &amp;gt;&amp;gt;~/.bash_profile
#应用
source ~/.bash_profile

以下其他版本同理，修改devtoolset版本号即可。
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="再次编译"&gt;再次编译&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 编译出错时，清出编译生成的文件
make distclean

# 编译 并指定安装目录
make PREFIX=/usr/local/redis6.0.5 install
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="看到下面的结果就说明安装成功"&gt;看到下面的结果就说明安装成功&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSTALL redis-sentinel
    CC redis-cli.o
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: Leaving directory `/usr/local/redis-6.0.5/src'
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## 创建配置文件目录
mkdir -p /usr/local/redis6.0.5/etc

cp ~/redis-6.0.5/redis.conf /usr/local/redis6.0.5/etc

# 将bin目录添加到环境变量中
export PATH=$PATH:/usr/local/redis6.0.5/bin

# 启动 redis服务
redis-server /usr/local/redis6.0.5/etc/redis.conf

# 关闭服务
redis-cli shutdown
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="配置系统服务"&gt;配置系统服务&lt;/h2&gt;&lt;h3 id="配置文件参数"&gt;配置文件参数&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo vi /usr/local/redis6.0.5/etc/redis.conf
port 6379                           # 默认的端口
dir ./                              # 持久化文件存放路径
daemonize  no=&amp;gt;yes                          # 以守护进程启动
supervised no=&amp;gt;systemd         #以systemd控制启动
pidfile /var/run/redis_6379.pid     # pid文件路径
logfile ""                          # 日志文件路径
bind 0.0.0.0            # 远程连接
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="编写service文件"&gt;编写 service 文件&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vi /etc/systemd/system/redis.service

[Unit]
Description=Redis6.0.5
After=redis6.service

[Service]
Type=forking
ExecStart=/usr/local/redis6.0.5/bin/redis-server /usr/local/redis6.0.5/etc/redis.conf 
ExecStop=/usr/local/redis6.0.5/bin/redis-cli shutdown
ExecReload=/bin/kill -s HUP $MAINPID
PrivateTmp=true
RestartSec=10
# The UNIX user and group to execute PostgreSQL as
User=redis
Group=db

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 重新加载配置文件
systemctl daemon-reload

# 添加执行权限
chmod 754 /usr/systemd/system/redis.service

systemctl disable redis.service
systemctl enable redis.service

systemctl status redis.service
systemctl start redis.service
systemctl restart redis.service
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="开放端口"&gt;开放端口&lt;/h3&gt;
&lt;p&gt;我这里没有遇到过端口问题，但还是先记录吧。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firewall-cmd --add-port=6379/tcp --permanent               #永久添加6379端口例外(全局)
firewall-cmd --remove-port=6379/tcp --permanent            #永久删除6379端口例外(全局)
firewall-cmd --reload
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="连接其他redis"&gt;连接其他 redis&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli -h 192.168.43.32 -p 6379
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="常用的配置项"&gt;常用的配置项&lt;/h2&gt;
&lt;p&gt;列举 Redis 常用的配置项：
 &lt;strong&gt;daemonize&lt;/strong&gt; 如果需要将 Redis 服务以守护进程在后台运行，则把该项的值改为 yes
 &lt;strong&gt;pidfile&lt;/strong&gt; 配置多个 pid 的地址，默认在/var/run/redis/pid
 &lt;strong&gt;bind&lt;/strong&gt; 绑定 ip，设置后只接受来自该 ip 的请求
 &lt;strong&gt;port&lt;/strong&gt; 监听端口，默认是 6379
 &lt;strong&gt;timeout&lt;/strong&gt; 客户端连接超时的设定，单位是秒
 &lt;strong&gt;loglevel&lt;/strong&gt; 分为 4 级，debug、verbose、notice、warning
 &lt;strong&gt;logfile&lt;/strong&gt; 配置 log 文件地址
 &lt;strong&gt;databases&lt;/strong&gt; 设置数据库的个数，默认使用的数据库为 0
 &lt;strong&gt;save&lt;/strong&gt; 设置 redis 进行数据库镜像的频率
 &lt;strong&gt;rdbcompression&lt;/strong&gt; 在进行镜像备份时，是否进行压缩
 &lt;strong&gt;Dbfilename&lt;/strong&gt; 镜像备份文件的文件名
 &lt;strong&gt;Dir&lt;/strong&gt; 数据库镜像备份文件的存放路径
 &lt;strong&gt;Slaveof&lt;/strong&gt; 设置数据库为其他数据库的从数据库
 &lt;strong&gt;Masterauth&lt;/strong&gt; 主数据库连接需要的密码验证
 &lt;strong&gt;Requirepass&lt;/strong&gt; 设置登录时，需要使用的密码
 &lt;strong&gt;Maxclients&lt;/strong&gt; 设置同时连接的最大客户端数量
 &lt;strong&gt;Maxmemory&lt;/strong&gt; 设置 redis 能够使用的最大内存
 &lt;strong&gt;Appendonly&lt;/strong&gt; 开启 append only 模式
 &lt;strong&gt;Appendfsync&lt;/strong&gt; 设置对 appendonly.aof 文件同步的频率
 &lt;strong&gt;vm-enabled&lt;/strong&gt; 是否开启虚拟内存支持
 &lt;strong&gt;vm-swap-file&lt;/strong&gt; 设置虚拟内存的交换文件路径
 &lt;strong&gt;vm-max-memory&lt;/strong&gt; 设置 redis 能够使用的最大虚拟内存
 &lt;strong&gt;vm-page-size&lt;/strong&gt; 设置虚拟内存的页大小
 &lt;strong&gt;vm-pages&lt;/strong&gt; 设置交换文件的总的 page 数量
 &lt;strong&gt;vm-max-threads&lt;/strong&gt; 设置 VMIO 同时使用的线程数量
 &lt;strong&gt;Glueoutputbuf&lt;/strong&gt; 把小的输出缓存存放在一起
 &lt;strong&gt;hash-max-zipmap-entries&lt;/strong&gt; 设置 hash 的临界值
 &lt;strong&gt;Activerehashing&lt;/strong&gt; 重新 hash&lt;/p&gt;

&lt;p&gt;启动后如果使用 RedisDesktopManager 连接是不成功的，还需要设置密码和设置绑定&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#修改配置&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/redis-4.0.11/
vim redis.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改里面的
 Requirepass yourpassword
 bind 0.0.0.0&lt;/p&gt;

&lt;p&gt;重新启动 Redis 即可！！！&lt;/p&gt;
&lt;h3 id="卸载Redis"&gt;卸载 Redis&lt;/h3&gt;
&lt;p&gt;停服务、删文件即可！&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#查看进程&lt;/span&gt;
ps aux |grep redis
&lt;span class="c"&gt;#杀掉进程&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; 进程号
&lt;span class="c"&gt;#查看相关文件&lt;/span&gt;
find / &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"redis"&lt;/span&gt;
&lt;span class="c"&gt;#删除文件&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; 文件
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://ncc0706.github.io/2020/05/21/db/redis/02.centos7-install-redis.6.0.3/" rel="nofollow" target="_blank"&gt;https://ncc0706.github.io/2020/05/21/db/redis/02.centos7-install-redis.6.0.3/&lt;/a&gt;&lt;/p&gt;</description>
      <author>clousky2020</author>
      <pubDate>Sat, 09 Jan 2021 11:09:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/40793</link>
      <guid>https://ruby-china.org/topics/40793</guid>
    </item>
    <item>
      <title>旧项目的 Rails、Puma、Sidekiq 升级</title>
      <description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;有需求要使用新版本的 rails、puma、sidekiq，今天对升级做一下基础测试。&lt;/p&gt;

&lt;p&gt;还有多个使用 systemd 启动的 puma 做一下部署测试，看一下部署过程中会不会产生干扰。&lt;/p&gt;
&lt;h2 id="旧项目的rails、puma、sidekiq升级"&gt;旧项目的 rails、puma、sidekiq 升级&lt;/h2&gt;
&lt;p&gt;拿了我自己刚开始学习的时候的一个微信的项目做测试，是用 rails5.1，PUMA3.7、sidekiq5.2.9 的。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chriszou.com/2020/12/16/geekweibo-upgrade-to-rails-6-1/" rel="nofollow" target="_blank" title=""&gt;参考资料&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;从其他 ruby 使用者听说：只要没有用到 Active Storage，直接可以直接改版本号升级。加上有 git 保底，所以直接在 gemfile 里改了版本号&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- gem 'rails', '~&amp;gt; 5.1.6'
+ gem 'rails', '~&amp;gt; 6.1'

- gem 'sidekiq'
+ gem 'sidekiq', '~&amp;gt;6'

- gem 'puma', '~&amp;gt; 3.7'
+ gem 'puma', '~&amp;gt; 5.1'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入&lt;code&gt;bundle update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;结束后 IDE 提示再&lt;code&gt;bundle install&lt;/code&gt;一下&lt;/p&gt;

&lt;p&gt;然后本地&lt;code&gt;rails s&lt;/code&gt;，打开页面能看且正常操作。但这个项目主要还是微信公众号的回复，这其中也涉及到 sidekiq 的使用，所以还得部署到服务器上测试下。&lt;/p&gt;

&lt;p&gt;使用的是 capistrano+passenger 的部署方式，所以后续也不用处理项目重启之类的操作，在把代码提交到 git 后直接输入&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cap production deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待部署完成。&lt;/p&gt;

&lt;p&gt;但之后发现服务器里项目启动不了，之后查询日志，&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ E 2020-12-20 21:37:32.5919 22106/T6z age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /home/ruby/weixin/current: The application encountered the following error: Couldn't find Active Storage configuration in /home/ruby/weixin/releases/20201220132931/config/storage.yml (RuntimeError)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说是找不到 config/storage.yml 文件，经人帮助，在 config 里新建了 storage.yml 文件，里面的内容：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test:
  service: Disk
  root: &amp;lt;%= Rails.root.join("tmp/storage") %&amp;gt;

local:
  service: Disk
  root: &amp;lt;%= Rails.root.join("storage") %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails5.1 的时候还没有这个文件，update 后也没有生成，所以报错了。之后顺利启动。&lt;/p&gt;

&lt;p&gt;微信进入公众号，输入文字内容，自动图文回复正常，但计算结果图文回复就出错了，进入 sidekiq 的仪表盘查看错误内容，发现是程序去找以前的 releases 里的素材了，但经过多次部署后已经删除了，所以出错。不过起码证明了 sidekiq 的运行正常。不过后面我手动 kill sidekiq 进程后就不能启动，查看日志发现对 redis 的版本号有了要求，要 redis4.0 及以上，而现在服务器里 redis 的版本是 3.0.6，那就升级吧。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cnblogs.com/xsge/p/13841875.html" rel="nofollow" target="_blank" title=""&gt;参考&lt;/a&gt;升级到了 6.0.5.&lt;/p&gt;

&lt;p&gt;之后在使用&lt;code&gt;redis-server redis.conf&lt;/code&gt;启动了 redis，&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl start sidekiq.service&lt;/code&gt;启动 sidekiq，&lt;/p&gt;

&lt;p&gt;进入 sidekiq 的仪表盘发现队列信息全部都被清空了，应该是重装 redis 的过程中把过去的信息删除掉了。幸好是个人项目而且没什么重要的需要持久化的信息在里面。之后程序的自动图文回复和问题回复都能正常使用了。&lt;/p&gt;
&lt;h2 id="查看由systemd启动的两个puma会不会相互影响"&gt;查看由 systemd 启动的两个 puma 会不会相互影响&lt;/h2&gt;
&lt;p&gt;新建了项目 demo1 和 demo2，用&lt;code&gt;mina deploy&lt;/code&gt;放到服务器上用 systemd 启动，
进入&lt;code&gt;/etc/systemd/system&lt;/code&gt;目录，新建&lt;code&gt;puma-demo1.service&lt;/code&gt;和&lt;code&gt;puma-demo2.service&lt;/code&gt;这两个文件，主要内容如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple
User=ruby
WorkingDirectory=/home/ruby/demo1/current
Environment=RAILS_ENV=production
ExecStart=/home/ruby/.rbenv/bin/rbenv exec bundle exec puma -C /home/ruby/demo1/current/config/puma.rb
ExecStop=/home/ruby/.rbenv/bin/rbenv exec bundle exec pumactl -F /home/ruby/demo1/current/config/puma.rb stop
ExecReload=/home/ruby/.rbenv/bin/rbenv exec bundle exec puma -F /home/ruby/demo1/current/config/puma.rb phased-restart
TimeoutSec=15

Restart=always

RestartSec=5
KillMode=process

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;code&gt;ExecStart&lt;/code&gt;表示启动命令，正常我们在服务器上可能就是&lt;code&gt;bundle exec puma&lt;/code&gt;就启动了，但这是因为已经配好了系统环境，这里我们要把使用的命令完整的写上去。&lt;/p&gt;

&lt;p&gt;前半段&lt;code&gt;/home/ruby/.rbenv/bin/rbenv exec bundle exec puma&lt;/code&gt;表示使用&lt;code&gt;rbenv的路径名里的rbenv&lt;/code&gt;启动 puma，后面增加一个&lt;code&gt;-C /home/ruby/demo1/current/config/puma.rb&lt;/code&gt;表示要使用这个路径下的配置文件&lt;code&gt;puma.rb&lt;/code&gt;。这里使用了默认安装时自带的&lt;code&gt;puma.rb&lt;/code&gt;文件，我在生产环境的话会用&lt;code&gt;/home/[user_name]/[project_name]/shared/puma.rb&lt;/code&gt;代替，然后上述目录下新建一个&lt;code&gt;puma.rb&lt;/code&gt;配置文件。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#更换了ExecStart的启动路径
ExecStart=/home/ruby/.rbenv/bin/rbenv exec bundle exec puma -C /home/ruby/demo1/shared/puma.rb
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#新建/home/ruby/demo1/shared/puma.rb文件

#!/usr/bin/env puma
#运行目录
directory '/home/ruby/demo1/current'
rackup "/home/ruby/demo1/current/config.ru"
#运行环境
environment 'production'
tag ''
#生成.pid文件位置
pidfile "/home/ruby/demo1/shared/tmp/pids/puma.pid"
#存放相关信息的文件路径
state_path "/home/ruby/demo1/shared/tmp/pids/puma.state"
stdout_redirect '/home/ruby/demo1/current/log/puma.access.log', '/home/ruby/demo1/current/log/puma.error.log', true
threads 4,16
bind 'unix:///home/ruby/demo1/shared/tmp/sockets/myblog-puma.sock'
workers 0
restart_command 'bundle exec puma'
preload_app!
on_restart do
  puts 'Refreshing Gemfile'
  ENV["BUNDLE_GEMFILE"] = ""
end
before_fork do
  ActiveRecord::Base.connection_pool.disconnect!
end
on_worker_boot do
  ActiveSupport.on_load(:active_record) do
    ActiveRecord::Base.establish_connection
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上准备好后可以用 systemd 启动了，执行&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl start puma-demo1.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl start puma-demo2.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;启动完毕后使用指令&lt;code&gt;ps aux|grep puma&lt;/code&gt;查询运行情况，&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby     25056  0.8  5.1 900620 101744 ?       Ssl  15:09   0:00 puma 5.1.1 (tcp://0.0.0.0:3001) [1]
ruby     25686 43.5  4.9 824772 96368 ?        Ssl  15:10   0:00 puma 5.1.1 (tcp://0.0.0.0:3000) [2]
ruby     26000  0.0  0.0  14428  1032 pts/0    S+   15:10   0:00 grep --color=auto puma
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着在本地计算机使用&lt;code&gt;mina deploy&lt;/code&gt;然后重新部署了一下 demo1，因为我在 mina 中没有配置部署后重启的脚本，所以 mina deploy 后进程号没变。&lt;/p&gt;

&lt;p&gt;然后在服务器上重启了 demo1 服务&lt;code&gt;sudo systemctl restart puma-demo1.service&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby     25056  0.4  5.1 900620 101744 ?       Ssl  15:09   0:00 puma 5.1.1 (tcp://0.0.0.0:3001) [1]
ruby     26313 44.0  4.9 824776 96216 ?        Ssl  15:12   0:00 puma 5.1.1 (tcp://0.0.0.0:3000) [2]
ruby     26626  0.0  0.0  14428  1156 pts/0    S+   15:12   0:00 grep --color=auto puma
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;demo1 的进程变了，demo2 的进程没变，这说明 systemd 里不同进程也是相互隔离的，互不影响。&lt;/p&gt;
&lt;h2 id="使用mina启动sidekiq并测试多个sidekiq进程相互间是否有影响"&gt;使用 mina 启动 sidekiq 并测试多个 sidekiq 进程相互间是否有影响&lt;/h2&gt;&lt;h3 id="完成mina的配置"&gt;完成 mina 的配置&lt;/h3&gt;
&lt;p&gt;首先碰到的问题是 mina-sidekiq 的 gem 不能自动更新到支持 sidekiq&amp;gt;6.0 内容，虽然 git 上的文档说是支持的，但实际上 bundle install 后，mina tasks 里并没有适配 sidekiq6 的 install 的任务。后来发现 mina-sidekiq 的作者已经不维护这个项目了，support sidekiq6 的代码是别人提交过来的，也不知道是哪里没设置好，新的内容不能通过 bundle 直接更新。&lt;/p&gt;

&lt;p&gt;既然自动更新不行，那我们就自己改。mina-sidekiq 新的内容主要就改了两个文件，一个说明 MD，这个对于我们使用者来说不重要，可以忽略。&lt;/p&gt;

&lt;p&gt;还有一个主要改动的文件是&lt;code&gt;lib/mina_sidekiq/tasks.rb&lt;/code&gt;，这里新增加了对 sidekiq6 的支持，所以我们在本地找到这个文件，我本地是用 rvm 管理的，所以我的文件是在&lt;code&gt;/Users/mac/.rvm/gems/ruby-2.7.1/gems/mina-sidekiq-1.0.3/lib/mina_sidekiq/tasks.rb&lt;/code&gt;，复制&lt;a href="https://github.com/Mic92/mina-sidekiq/pull/33/commits/8681adf9cd0468c7a00ac39fc28244b4dfbe62ba" rel="nofollow" target="_blank" title=""&gt;官方内容&lt;/a&gt;覆盖到这个文件里，这样我们就算是手动更新了~&lt;/p&gt;

&lt;p&gt;然后在&lt;code&gt;/config/deploy.rb&lt;/code&gt;里添加以下内容&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set :init_system, :systemd  #做标示，让mina-sidekiq脚本执行systemd的指令
set :service_unit_path, '/home/ruby/.config/systemd/user'  #脚本默认的存放位置需要root权限，改成用户下面的.config文件
set :bundler_path, '/home/ruby/.rbenv/shims/bundler'  #我的服务器上用rbenv，改成这个地址，脚本默认地址里没有我安装的rbenv

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关于官方文档里写的给 linux 添加&lt;a href="https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)/User_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)" rel="nofollow" target="_blank" title=""&gt;loginctl enable-linger username&lt;/a&gt;指令，我试了下，加或不加都不影响后续操作，我就不加了。&lt;/p&gt;

&lt;p&gt;接下来就按照官方文档本地项目启用&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mina sidekiq:install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;会显示已经在设定的位置 Creating systemctl unit file，之后启动&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mina sidekiq:start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;我们登上服务器看一下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby@iZbp130:~$ ps aux|grep sidekiq
ruby     26286 10.0  4.6 820520 91000 ?        Ssl  10:13   0:01 sidekiq 6.1.2 demo1 [0 of 10 busy]
ruby     26615  0.0  0.0  14428  1016 pts/0    S+   10:13   0:00 grep --color=auto sidekiq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到 sidekiq 已经启动，关闭也和原来一样使用&lt;code&gt;mina sidekiq:stop&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="测试两个sidekiq进程会不会相互影响"&gt;测试两个 sidekiq 进程会不会相互影响&lt;/h3&gt;
&lt;p&gt;接下来要把 demo2 的 sidekiq 也启动，但需要先在&lt;code&gt;/config/deploy.rb&lt;/code&gt;里增加一行&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set :service_unit_name, "sidekiq-2-#{fetch(:rails_env)}.service" #自定义服务文件名称
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为两个项目都是在同一个用户下且.service 文件是放在相同的目录里，所以文件名要不同，这里我在 sidekiq 后面加了个 -2 作为区分。&lt;/p&gt;

&lt;p&gt;然后启动两个项目的 sidekiq,&lt;code&gt;mina sidekiq:start&lt;/code&gt;，在服务器上查看一下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby@iZbp130:~$ ps aux|grep sidekiq
ruby       532  0.3  5.2 824972 103196 ?       Ssl  10:31   0:01 sidekiq 6.1.2 demo1 [0 of 10 busy]
ruby      2097 13.5  5.0 900332 99120 ?        Ssl  10:37   0:01 sidekiq 6.1.2 demo1 [0 of 10 busy]
ruby      2418  0.0  0.0  14428  1084 pts/0    S+   10:37   0:00 grep --color=auto sidekiq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可能是因为我的 demo2 是复制 demo1 的，里面 sidekiq 的配置没改动过，这里两条进程信息都写着 demo1，实际上后面这条 2097 的应该属于 demo2。现在我们本地发指令关掉 demo2 试试，&lt;/p&gt;

&lt;p&gt;&lt;code&gt;demo2 mac$ mina sidekiq:stop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;服务器上查看：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby@iZbp130bctfwzkh4bsns7iZ:~$ ps aux|grep sidekiq
ruby       532  0.2  5.5 826988 109532 ?       Ssl  10:31   0:01 sidekiq 6.1.2 demo1 [0 of 10 busy]
ruby      2757  0.0  0.0  14428  1008 pts/0    S+   10:42   0:00 grep --color=auto sidekiq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很好，后面属于 demo2 的 sidekiq 已经没了，而 demo1 的 sidekiq 进程还存在且没有变动过，说明两者互不干扰，这就达成今天的测试目标了。&lt;/p&gt;
&lt;h2 id="使用mina-systemd"&gt;使用 mina-systemd&lt;/h2&gt;
&lt;p&gt;在他人的帮助下，找到了另一种方法，就是使用&lt;a href="https://github.com/leebo/mina-systemd" rel="nofollow" target="_blank" title=""&gt;mina-systemd（修改版）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这是 mina 的 systemd 服务管理器的封装，上面的 puma 还没有达到本地启停，正好就用这个远程启动。&lt;/p&gt;

&lt;p&gt;但要注意的是 mina-systemd 的原作者也是很久没更新了，所以这里我们要安装修改版的内容，Gemfile 里要写：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem 'mina-systemd', require: false, git: 'https://github.com/leebo/mina-systemd.git'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是安装原作者的版本，会出现和现在&lt;code&gt;mina 1.2.3&lt;/code&gt;版本不适配的情况，要降到&lt;code&gt;mina 1.0.7&lt;/code&gt;才行，而这个版本在&lt;code&gt;mina deploy&lt;/code&gt;的时候又会出错，所以还是使用别人修改好的版本吧。&lt;/p&gt;

&lt;p&gt;前面已经在服务器上创建了 PUMA 的 service 文件&lt;/p&gt;

&lt;p&gt;&lt;code&gt;puma-demo1.service&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;接下来登录服务器，输入&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo vim /etc/sudoers&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;在其中添加以下内容：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby   ALL=NOPASSWD: /bin/systemctl status puma-demo1
ruby   ALL=NOPASSWD: /bin/systemctl start puma-demo1
ruby   ALL=NOPASSWD: /bin/systemctl stop puma-demo1
ruby   ALL=NOPASSWD: /bin/systemctl restart puma-demo1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最前面是操作的用户名，后面是每次操作的指令和操作的 service 名字，这样让本地的指令直接无密码操作。如果没加这条直接去操作的话，就卡住了。&lt;/p&gt;

&lt;p&gt;在/config/deploy.rb 里添加&lt;/p&gt;

&lt;p&gt;&lt;code&gt;require 'mina/systemd'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;现在可以在本地终端里输入&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mina systemctl:start['puma-demo1']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;服务器上&lt;code&gt;ps aux|grep puma&lt;/code&gt;查看：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby     12737  5.1  5.2 900328 101812 ?       Ssl  20:36   0:00 puma 5.1.1 (tcp://0.0.0.0:3000) [1]
ruby     13068  0.0  0.0  14428  1068 pts/0    S+   20:36   0:00 grep --color=auto puma
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确实的启动了，再关闭它，&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mina systemctl:stop['puma-demo1']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;服务器上&lt;code&gt;ps aux|grep puma&lt;/code&gt;查看：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ruby     13415  0.0  0.0  14428  1052 pts/0    S+   20:36   0:00 grep --color=auto puma
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这当中主要的内容就是要在 sudoers 文件里添加免密指令，今天折腾了一天部署脚本后来就是卡在登录的问题上了。&lt;/p&gt;

&lt;p&gt;sidekiq 也能用这个方式去启停，这里就不演示了。这样 mina-puma 和 mina-sidekiq 这两个 gem 也算是完成了自己的使命，可以退休了。&lt;/p&gt;</description>
      <author>clousky2020</author>
      <pubDate>Tue, 22 Dec 2020 15:47:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/40727</link>
      <guid>https://ruby-china.org/topics/40727</guid>
    </item>
    <item>
      <title>自学 Rails 大半年，是否能入行开发？</title>
      <description>&lt;p&gt;从今年 4 月开始学习 ruby 和 rails，上个月开始为前公司写了个单据管理的 web，主要解决原来工作中单据处理不及时、查看不方便等问题。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/clousky2020/Textile" rel="nofollow" target="_blank" title=""&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://clousky.club/articles/18" rel="nofollow" target="_blank" title=""&gt;想到哪写到哪的开发日记&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.clousky.ltd/" rel="nofollow" target="_blank" title=""&gt;体验版&lt;/a&gt;,默认账户有管理员、车间主任、采购员、销售员、财务，默认密码 123456。（最低配阿里云，加载可能会有些慢）&lt;/p&gt;

&lt;p&gt;因我年初离职，原来负责的工作内容被分割后仍有部分被搁置不动了。原来是使用 Excel+vba 进行工作的，离职后也没人去做相关工作了（还亏我原来在 Excel 上做了大量简化操作，只要在相应的位置输入数值就可以了），上次和领导聊天的时候还有抱怨说这部分工作没人做，想查都查不到，遂有了这个项目。&lt;/p&gt;

&lt;p&gt;目前已提供给前公司使用，经历过几次迭代，暂时满足目前需要，当然以后又新的需求也会帮忙更新的，毕竟前公司和家里有一些关系。
工作性质决定了其使用频率并不高，单据输入平均每天大概也就 10 次以内（有时候可能一天都没有用）。&lt;/p&gt;

&lt;p&gt;目前自我感觉做的内容也不深入，ruby、rails 也只是会基础应用，看了&lt;a href="https://space.bilibili.com/573735582?from=search&amp;amp;seid=5431963733666048489" rel="nofollow" target="_blank" title=""&gt;showmebug&lt;/a&gt;发布的招聘视频，发现好多问题都是没见过的，种类繁多。但写 rails 的过程中，大部分都没碰到（也许是碰到了但我没意识到？）&lt;/p&gt;

&lt;p&gt;希望各位前辈能指点一下，转行实习开发还需要哪些方面的知识需要学习？是优先从开源项目中学会各种生产所需的方式还是像招聘视频中说的深入理解语言、数据库等的底层代码实现？
或者上面的项目中有哪些地方有缺陷，考虑不周的地方也请指出。&lt;/p&gt;

&lt;p&gt;谢谢！&lt;/p&gt;</description>
      <author>clousky2020</author>
      <pubDate>Sun, 29 Nov 2020 13:05:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/40640</link>
      <guid>https://ruby-china.org/topics/40640</guid>
    </item>
  </channel>
</rss>
