阅读 176

运维常用指令

如何使用log:

1.用deploy登陆。

2.cd ~/xxx/current. 进入Rails程序的当前目录下。

3.tail -n 500 log/production.log 查看最近期的500条记录。

4.tail -f log/production.log 这样一直挂着,随时看最新的纪录。

 

许多程序数据库的log都可以在/var/log中找到对应的文件夹。如mysql, redis, nginx。

 

Rails的错误信息,有可能发生在Nginx。log位置在

/var/log/nginx/error.log

打开这个文件需要root身份。

 

另外:/var/log/nginx/access.log纪录用户的访问信息,文件磁盘占用增长非常快,最好使用logrotate工具切割日志记录(具体方法参考https://zhuanlan.zhihu.com/p/24880144)。

 

 

查看系统状态

 

free -h 显示内存用量

df -h 显示硬盘剩馀空间, disk file

sudo passenger-status 显示 Passenger 状态:主要观察 Passenger 开了多少个 Rails 进程(默认最多开6个,如果机器的内存够多,你可以调整 Nginx 设定 passenger_max_pool_size 增加更多进程来服务更多流量)

 

sudo passenger-memory-stats 显示 Passenger 内存状态,主要观察每个 Rails 进程耗费多少内存

---- Passenger processes -----PID    VMSize    Private  Name-------------------------------

24591  404.0 MB  77.1 MB  Passenger AppPreloader:/home/deploy/transaction/current (forking…)

 

 

 

top 动态查看系统状态,主要可以看 CPU 负载情形,以及哪些进程在忙.

 

ps ax 显示目前所有进程(process)一个快照,

用 sudo kill -9 <PID> 可以强制删除该程序,这是最后手段。

 

因为,内核立即终止被kill的进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。

 

 

kill [-signal] PID...

kill 命令不是真的“杀死”程序,而是给程序发送信号。

 

signal有多个:一般用数字表示,-9就是强行终止程序。

 

信号是操作系统与程序之间进行通信时所采用的几种方式中的一种。

比如ctrl + c, 这个组合按键就是一个信号。使用它会发送一个(Interrupt,中断)的信号。

 

程序,相应地,监听信号的到来,当程序 接到信号之后,则做出响应。

 

 

排查

网站如果无法正常运作,第一个检查网络是否正常,是不是可以 SSH 连线进去。如果第一关就卡住了,可能整台机器已经蒙了,这时候需要回到云服务的后台,强制关机重开。

 

如果可以连线进去,就先检查目前系统负载情形,是不是内存不够了? 或是硬盘满了? 

如果是 Passenger 进程太多人塞住了,可以先尝试重开 Nginx 让网站恢复运作。

如果还是没多久还是一样,就需要进一步看 log 检查是哪一个环节不正常。

 

 

网站服务器重启指令

 

默认安装完以及开机后,就会启动 Nginx。如果有修改 Nginx 设定档,需要重开 Nginx。

 

启动 sudo service nginx start

停止 sudo service nginx stop

重开 sudo service nginx restart

 

如果只是要重开 Rails,可以不重开 Nginx。在你的 Rails 目录下(例如 /home/deploy/rails-recipes/current 这个目录)执行 touch tmp/restart.txt 即可,这样 Passenger 就会知道要重新加载 Rails,而不需要重开 Nginx。(不理解,因为只是新建一个file而已。)

 

在远端如何进 rails console?

 

用deploy身份:

cd ~/.your_project/current

执行 bundle exec rails c -e production

 

 

如何在远端跑 rake?

 

用deploy身份:

cd ~/.your_project/current

执行 RAILS_ENV=production bundle exec rake db:seed

 

 

整理 Log 档案

参考https://zhuanlan.zhihu.com/p/24880144

 

Linux 内建有 logrotate 工具,可以定期清空和压缩 Log 档案。 

 

使用/etc/logrotate.d 日志管理文件夹来自定义应用的配置。

该目录里的所有文件都会被主动的读入到/etc/logrotat.conf中执行。

 

 

新增touch rails 档案:

复制代码

/home/deploy/your_appname/shared/log/*.log {
  daily 
  dateext
  missingok
  rotate 65535
  compress 
  notifempty
  copytruncate
}

复制代码

  • daily 表示每天整理,也可以改成 weekly 或 monthly

  • dateext 表示档案补上 rotate 的日期

  • missingok 表示如果找不到 log 档也没关系

  • rotate 表示保留65535份,建议如果硬盘空间够的话,就不要砍log档了,以供未来备查

  • compress 表示压缩起来,默认用 gzip

  • delaycompress 表示延后压缩直到下一次 rotate

  • notifempty 表示如果 log 档是空的,就不 rotate

  • copytruncate 先复制 log 档的内容后,再清空的作法,因为有些程式一定 log 在本来的档名,例如 rails。另一种方法是 create。

 

具体说明在server读man logrotate

 

运行logrotate:

执行

logrotate  /etc/logrotate.d/程序名称 

(如rails,需要设定权限chmod 777  /etc/logrotate.d/程序名称)

或者

sudo /usr/sbin/logrotate -f /etc/logrotate.conf

 

参数:

-d, 测试日志切割(debug)

-vf, 强制轮询切割日志(verbose and force)

 

如果linux没有,安装 

sudo apt-get logrotate

 


 

 

在服务器安装异步的支持

关于安装sidekiq和activejob的使用见: https://www.cnblogs.com/chentianwei/p/9227594.html

 

要在 Ubuntu 上安装 Redis 很简单:

服务器上执行 sudo apt-get install redis-server安装

本地使用brew install logrotate.

 

然后,调整capistrano。 https://github.com/seuros/capistrano-sidekiq

Gemfile
  group :development, :test do
    gem 'capistrano-rails'
    gem 'capistrano-passenger'+   gem 'capistrano-sidekiq'

 

复制代码

+

复制代码

 

 

执行 cap production deploy远端服务器上就会跑起来 Sidekiq 了。

使用ps ax | grep 'sidekiq' 可查看进程。

之后每次 cap production deploy 进行布署的时候,这也会重开 sidekiq。

 


 

 

Cron 固定排程

 Sidekiq 是不定时由用户的某个行为来触发,但有时候我们需要的是某个固定时间由系统排程来执行,例如每天凌晨四点进行备份、每天凌晨寄信提醒缴费、每周一凌晨一点产生报表等等。这种情况可以透过 Linux 内建的例行性排程机制 Cron

 

例行性工作排程(crontab)

首先,你先将需要执行的任务写成一个 rake 指令,这样就可以在主机上用 crontab 指令去执行这个 rake

不过由于 crontab 的格式不是非常友善,我们可以透过 whenever 这个 Gem 来编辑,用 Ruby 的语法撰写 crontab 语法,并且他支援搭配 capistrano 在布署时自动更新 crontab,非常方便。

 

 

gem 'whenever'  (7700✨)

 

Cron jobs in Ruby

 

安装后执行: wheneverize .

 

生成config/schedule.rb.

 

然后安排计划:

复制代码

env :PATH, ENV['PATH']
set :output, 'log/cron.log'# 每个小时调用一次 rake check_event_registrationsevery 1.hour do
  rake "check_event_registrations"end# 每天调用一次 rake fetch_user_feedsevery 1.day do
  rake "fetch_user_feeds"end

复制代码

whenever使用了3种预定义的job 类型: 

  • command

  • runner

  • rake

  • 还可以自定义 

 

Capistrano 设定

在 Capfile 加入 require "whenever/capistrano"

这样就会在 cap production deploy 自动化布署时,自动更新服务器上的 crontab。

 


 

安全防护

调整服务器 SSH 设定

服务器开了自己帐号之后,我们可以不允许 root 远端登入:

 

用 root 权限编辑 /etc/ssh/sshd_config

复制代码

PermitRootLogin no

#必须提取设定好公????,否则无法使用ssh相关的命令,如scp。PasswordAuthentication no

#防止黑客猜密码。
 

复制代码

执行 sudo service ssh restart

 

防火墙

像 Linode 并没有内建防火墙功能,我们可以用 ufw 这个工具来设定 Linux 要开放哪些 Port。

sudo apt-get install ufw

  program for managing a netfilter firewall

sudo ufw default deny   #只使用白名单。sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable 启用防火墙

 

提示:

Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

 

sudo ufw status 显示目前状态

复制代码

To                         Action      From--                         ------      ----
22                         ALLOW       Anywhere80                         ALLOW       Anywhere443                        ALLOW       Anywhere22 (v6)                    ALLOW       Anywhere (v6)80 (v6)                    ALLOW       Anywhere (v6)443 (v6)                   ALLOW       Anywhere (v6)

复制代码

 

如果发现网站被特定IP攻击,也可以用 ufw 来丢弃特定来源的数据包:

  • sudo ufw insert 1 deny from <要ban掉的IP>

  • sudo ufw reload


 

 

服务器数据备份

数据库:这是最重要的,需要汇出。

 

用户上传的档案:如果你有做档案上传的功能,就会需要备份这些档案。不过如果有用七牛云或 AWS S3 来放档案的话,就不需要担心了。

备份数据需要存放在不同台机器才保险。除了备份程序之外,复原的程序也很重要,需要实际验证。很多公司以为做了备份,但真的发生事情要复原时,才发现备份的档案不能用

 

 

汇出数据库:

 

复制代码

MySQL 的指令是 -W -U postgres -h localhost rails_recipes >

复制代码

 

数据库汇入:

MySQL 的指令是 mysql -u root -p rails_recipes < rails_recipes.sql

PostgreSQL 的指令是 psql -W -U postgres -h localhost rails_recipes < rails_recipes.sql

 

用户上传的档案:

放在 /home/deploy/rails-recipes/shared/public/system 目录下,请打包压缩备份回其他电脑。

 

自动备份

使用 https://github.com/backup/backup 这个 Ruby 工具可以帮助我们设定好自动备份,可以参考 https://gist.github.com/ihower/5a28624f9420fb9a7c49 这会备份整个 mysql 数据库,打包压缩整个 /srv 目录,上传到指定的 AWS S3 bucket,最后寄送 email 通知完成。

在服务器上执行 crontab -e 可以编辑例行性工作排程(crontab),以下是一个每日凌晨 4:30 自动执行的范例:

30 4 * * * /bin/bash -l -c '/usr/local/bin/backup perform -t my_backup -c /home/ihower/Backup/config.rb'

 


 

 

如何把远程文件复制到本地?

 

2020-4-7补充:

 

scp [参数] [原路径] [目标路径]

  • -r 递归复制整个目录。

 

大多数 Linux 发行版自带一个提供 SSH 功能的软件包,叫做 OpenSSH。

OpenSSH 软件包也包含两个程序,它们可以利用 SSH 加密通道在网络间复制文件。

其中,scp(安全复制)被用来复制文件,与熟悉的 cp 程序非常相似。

scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

 

在本地使用使用:scp username@xxxxx:/path/to/hosts/file/host_file ~

scp deploy@47.92.244.154:/home/deploy/transaction.sql.gz ~

 

复制代码

scp远程拷贝文件时提示错误:❌
Warning: Permanently added '10.0.0.182' (RSA) to the list of known hosts.
Permission denied (publickey).
解决: 登录root@xxxx,将/etc/ssh/sshd_config文件中的PasswordAuthentication no
改为PasswordAuthentication yes重启sshd服务:/etc/init.d/sshd restart 原因:scp是基于ssh的拷贝服务,ssh在没有密钥登录的情况下,禁用了密码登录,故出现如上错误。

复制代码

  

从本地复制文件到远程:

scp file_name deploy@xxxxx:~   #复制到了用户的目录/home/deploy

 


 

摘录 

https://ruby-china.org/topics/29752

 

运维 使用 Upstart + Inspeqtor 管理你的 Sidekiq (监控、崩溃自动重启、邮件通知)

 

用Ubuntu自带的Upstart去保证Sidekiq不会因为Ruby虚拟机崩溃等原因停止工作,用Inspeqtor结合Upstart去监控你的Sidekiq。(Sidekiq进程失败时发送邮件通知)。

 

Upstart是Ubuntu系统自带的基于事件的初始化常驻程序,可以在系统开机和关机时启动和关闭服务,在系统运行时对服务进行监督。 Upstart可以让被监督的进程在非正常关闭时,自动重启该进程,保证其在系统中正常稳定地运行。 

 

可以使用系统自带的工具去解决问题,相比较使用第三方工具而言,无疑是更好的方式。

来源:https://www.cnblogs.com/chentianwei/p/9931782.html


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐