megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

CentOS7にFFMpeg4をインストールする

CentOS7にFFMpeg4をインストールする記事はちょこちょこあるものの、上手く入らないことが多いのでちゃんと入った方法を残しておく。

環境

Service Version
CentOS 7.5

リポジトリの追加

2020.09.08 リポジトリSSL対応したようなので修正

$ yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
$ yum-config-manager --disable epel-multimedia

インストール

$ yum install --enablerepo=epel-multimedia ffmpeg ffmpeg-devel

確認

$ ffmpeg
ffmpeg version 4.1.4 Copyright (c) 2000-2019 the FFmpeg developers

ソースインストールのPHPにImageMagickをインストールする

インストール

必要なパッケージをインストールしてimagickをインストール

$ sudo yum install autoconf ImageMagick ImageMagick-devel
$ cd /usr/local/php/current/bin
$ sudo ./pecl install imagick

php.iniに追記

/usr/local/php/current/lib/php.ini

extension="imagick.so"

確認

$ php -m | grep imagick

Laravel mixのVue.jsをTypeScriptにしていく

はじめに

Node.js案件でTypeScriptを使ったところ便利すぎてほれ込んだので、Laravel mixで使っていたvueもTypeScript化していく事に。

とはいえ新規案件ならともかく既にある程度の大きさになっているので少しずつTypeScript化していく。

前提

Service Ver
Laravel 5.7
Vue.js 2.6.10
TypeScript 3.5.3
npm 6.9

必要なパッケージのインストール

$ npm install --save-dev ts-loader typescript vue-property-decorator babel-plugin-syntax-object-rest-spread

必要な追加ファイルをそろえる

ルートディレクトリに以下を追加。

オプションなどは適宜自由に変えてください。

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "inlineSourceMap": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "allowSyntheticDefaultImports": true,
    "declaration": false,
    "lib": [ "dom", "es2015" ]
  },
  "include": [
    "resources/assets/js/**/*"
   ],
  "exclude": ["node_modules"]
}

.babelrc

{
    "env": {
        "test": {
            "presets": [
                ["env", {
                    "targets": {
                        "node": "current"
                    }
                }]
            ]
        },
        "development": {
            "presets": [
                ["env", {
                    "modules": false,
                    "targets": {
                        "browsers": "> 2%",
                        "uglify": true
                    }
                }]
            ]
        },
        "production": {
            "presets": [
                ["env", {
                    "modules": false,
                    "targets": {
                        "browsers": "> 2%",
                        "uglify": true
                    }
                }]
            ]
        }
    },
    "plugins": ["syntax-object-rest-spread"]
}

Vue.jsのTypeScript定義ファイルの用意

適当な場所にディレクトリを切って定義ファイルを用意。

resources/assets/js/types/index.d.ts

declare module '*.vue' {
    import Vue from 'vue'
    export default Vue
}

webpack.mix.jsの編集

webpack.mix.js

-mix.js('resources/assets/js/app.js', 'public/js')
+mix.ts('resources/assets/js/app.ts', 'public/js')

mix.webpackConfig({
   resolve: {
       extensions: [".js", ".jsx", ".vue", ".ts", ".tsx"],
       alias: {
           'vue$': 'vue/dist/vue.esm.js',
       }
   },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: "ts-loader",
                options: { appendTsSuffixTo: [/\.vue$/] },
                exclude: /node_modules/
            }
        ]
    }
})

app.jsをapp.tsへ

resources/assets/js/app.js -> resources/assets/js/app.ts

import Vue from 'vue'

import router from './router'

/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */

import component from './pages/App.vue'
Vue.component('App', component)

const app: any = new Vue({
    router
})
app.$mount('#app')

しれっと vue-router をインストールしてますが、まあ気にしないでください。

実際に稼働中の物をts化していく際は、const hoge: any = require('./hoge') みたいな感じで全部 any で定義すればとりあえず動きます。そして後でゆっくりTypeScript化していってくださいな。

Let's Compile!!

$ npm run dev

これで動かなかったらエラーいっぱい出ます。

いっぱい出たらググって解消していってください。

私がTypeScript化した時に出たエラーが何だったか覚えてないです。。。(何のためのこのブログ)

一応覚えている限り、 ts-loader のバージョンが新しすぎて怒られたので戻した案件もありました。

でもほぼ同条件なのに怒られないものもあるので不思議。いろいろ勉強しなきゃ。。。

おわり

以上でTypeScript化完了です。

実際に開発をするなら eslint なども入れていくとは思いますし、ComponentやVuexもTypeScriptしていくわけですが、そのあたりは気が向いたらいずれ別の記事で。

(本業はサーバーサイドなのであんまり記事にしないと思う。。。)

さくらVPSで建てたApache2.4にに外部から接続が出来なかった件

はじめに

WEBサーバーとして利用していたさくらVPSのサーバーのOSをクリーンインストールしてCentOS7を入れることに。

さくさくっとサービスを立てていき、いざ外部から接続テストをしてみると繋がらない。

今まで何度もさくらVPSでWEBサーバーは立てているのに、こんなことは初めて!と調査やら試行錯誤で半日くらい使ってしまったお話。。。

TL;DR

2019年6月27日からパケットフィルタが提供開始されていた。

OSインストール時にデフォルトSSH(22)だけ許可で有効になる模様。

調査

サービスがたっているか確認

$ ps aux | grep httpd
root     19113  0.0  0.7 170676  7616 ?        Ss   16:28   0:00 /usr/local/apache2/v2.4.39/bin/httpd -k start

ふむ。ある。

ポートが空いているか確認

$ netstat -ant
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN

空いてる。

Firewalldの停止

$ systemctl status firewalld
   Active: inactive (dead)

止まっている。

(後で元に戻すのを忘れないように。)

なぜ外部から繋がらないのー!?

解決

普段ならここまで確認すればもう繋がっている。

という事はそもそもサーバーへの接続が届いていないのでは?と思い、VPSの管理画面を眺めていたら パケットフィルタ の文字が。

これやん。。。ナニコレ今までなかったよね。。。

という事でパケットフィルタで80番と443番ポートを許可して無事解決。

サーバーの管理画面とかめったに見ないよー!そんなの知らないよー!

Muninのログファイルが肥大化

Muninを眺めているとディスクの使用量が一カ月で50%を超える緊急事態に。

放置していれば来月にはディスクがパンパンで動かなくなるので調べてみたらMuninのログファイルがやったら目ったら大きい。。。

Munin見て気付いた結果「原因お前かよ!」といったお気持ち。

調査

調査も何も

$ du -sh /var/log/munin

と打つとやたら大きい。

どうやらログのローテートが動いていないという事で手動でローテートしてみる。

$ sudo logrotate -f /etc/logrotate.d/munin
error: skipping "/var/log/munin/munin-graph.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

結果

どうやら親ディレクトリのパーミッションでグループに書き込み権限があると怒られるらしい。

確かにapacheのアクセスを許可したかったので Userはmunin Groupは httpdでグループに書き込み権限を与えている。

そこで

$ sudo chmod g-w /var/log/munin

もしくは

$ sudo chmod 750 /var/log/munin

で解決。

とするとapacheで問題が発生したりしたら面倒なので(検証しろ)、ローテート側を変更することに。

/etc/logrotate.d/munin

/var/log/munin/munin-graph.log {
        su munin daemon
        daily
        rotate 7
        missingok
        notifempty
        compress
}

su munin daemon 親と同じUserとGroupにして完了。

ソースインストールのApacheにモジュールを追加する

今回はwebsocketのリバースプロキシとしてApacheを使いたかったので、mod_proxy_wstunnel をインストールする。

mod_soの確認

Apacheに後からモジュールを追加するためのモジュールが存在するかを確認する。

入っていない場合はApacheを再インストールする必要があるので、その際に必要なモジュールを追加してください。

$ /usr/local/apache2/bin/httpd -l | grep mod_so.c

インストールするモジュールの確認

Apacheをインストールした時のファイルにモジュールのソースファイルが沿内するか確認する。

もしソースファイルが無い場合は Apache のサイトからダウンロードしてください。

$ ll /usr/local/src/httpd-2.4.xx/modules/proxy/mod_proxy_wstunnel.c

コンパイル

apxsコマンドを使って追加したいモジュールをビルドする。

$ cd /usr/local/src/httpd-2.4.xx/modules/proxy
$ /usr/local/apache2/bin/apxs -c -i -a mod_proxy_wstunnel.c 
オプション 説明
-c コンパイル
-i インストール
-a httpd.confにLoadModule行を追加して有効化する

以上です。

CentOS7にDKIM設定をして迷惑メール対策

初めに

{} 内は適宜環境に合わせて読み替えてください。

環境

CentOS7.6 + Postfix 2.10.1

OpenDKIMのインストール

$ yum install --enablerepo=epel opendkim

暗号化キーの作成

$ mkdir /etc/opendkim/keys/{DOMAINNAME.com}
$ opendkim-genkey -D /etc/opendkim/keys/{DOMAINNAME.com}/ -b 1024 -d {MYDOMAIN.com} -s default

各オプションについて

オプション 内容
-D 生成ディレクト
-b 鍵のビット長。1024や2048などお好きに。
-d ドメイン
-s セレクタ名。自分が分かりやすいようにお好きに。

オーナーの変更

これを忘れて私は後でエラーになりました。

$ chown -R opendkim: /etc/opendkim 

OpenDKIM Configファイルの設定

/etc/opendkim.conf

Mode sv
#KeyFile /etc/opendkim/keys/default.private
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts

/etc/opendkim/KeyTable

default._domainkey.{DOMAN.com} {DOMAN.com}:default:/etc/opendkim/keys/{DOMAN.com}/default.private

/etc/opendkim/TrustedHosts

自サーバーからメールを送信するので特に設定なし

127.0.0.1
::1

/etc/opendkim/SigningTable

*@{DOMAIN.com} default._domainkey.{DOMAIN.com}

/etc/sysconfig/opendkim

AUTOCREATE_DKIM_KEYS=NO

OpenDKIMの起動

configの設定が完了すればDKIMを起動します。

$ systemctl start opendkim
$ systemctl status opendkim

問題なければ完了です。

後は必要に応じて自動起動も設定しておくといいでしょう。

$ systemctl enable opendkim

DNSを更新

利用しているDNSサーバーでTXTゾーンにDKIMの内容を反映させます。

$ cat /etc/opendkim/keys/{DOMAIN.com}/default.txt
{DOMAIN.com}._domainkey     IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMA.........." )  ; ----- DKIM key default for {DOMAIN.com}

今回はムームードメインムームDNSを使用しました。

サブドメイン 種別 内容
default._domainkey.{DOMAIN.com} A IPアドレス
default._domainkey TXT v=DKIM1; k=rsa; p=MIGfMA........;

Postfix Config設定

PostfixDKIM設定を有効にします。

/etc/postfix/main.cf

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

Postfixを再起動して設定を反映します。

$ systemctl restart postfix

終わり

最後に適当にGmailなりにでもメールを送信してみて、受信側のヘッダに dkim=pass とかあれば完了です。