nginxが.htaccess使えないの忘れていたので、HTTPで来たアクセスをHTTPSにリダイレクトする設定を今更書いた
server {
listen 80;
server_name www.jhhk-family.net;
return 301 http://www.jhhk-family.net/$request_uri;
}
nginxが.htaccess使えないの忘れていたので、HTTPで来たアクセスをHTTPSにリダイレクトする設定を今更書いた
server {
listen 80;
server_name www.jhhk-family.net;
return 301 http://www.jhhk-family.net/$request_uri;
}
AWSにメールサーバーを移設した際に、STARTSSLからSMTPSとIMAPSの環境に変更したので、そのメモ
環境:
AWS EC2 (Amazon Linux AMI 2017.09.1 (HVM), SSD Volume Type)
セキュリティグループ:
22/tcp , 25/tcp, 80/tcp(Let’s Encryptの認証用に一時的に開ける), 465/tcp, 993/tcp を開けておく。
必要なパッケージをインストール
yum install postfix dovecot cyrus-sasl cyrus-sasl-plain
LetsEncryptでメールサーバー用の証明書を発行
wordpress をELB+EC2でHTTPS通信させる
を参照
(SMTPSに必要な箇所のみ記載)
/etc/postfix/postfix.cf
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.jhhk-family.net/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.jhhk-family.net/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
tls_high_cipherlist = kEECDH:+kEECDH+SHA:kEDH:+kEDH+SHA:+kEDH+CAMELLIA:kECDH:+kECDH+SHA:kRSA:+kRSA+SHA:+kRSA+CAMELLIA:!aNULL:!eNULL:!SSLv2:!RC4:!MD5:!DES:!EXP:!SEED:!IDEA:!3DES
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_ciphers = high
/etc/postfix/master.cf
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
smtpd_client_restrictionsは未設定。必要に応じて。
/etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain
!include auth-system.conf.ext
/etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/letsencrypt/live/mail.jhhk-family.net/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.jhhk-family.net/privkey.pem
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
ssl_cipher_list = HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4:!3DES:!RSA
/etc/dovecot/conf.d/10-master.conf
service imap-login {
# inet_listener imap {
# port = 143
# }
inet_listener imaps {
port = 993
ssl = yes
}
最後にpostfix、dovecot、saslを起動する。
service saslauthd start
service postfix start
service dovecot start
pythonのramdomモジュールを使って、20人を超える飲み会の座席を固めてみる。
ramdomモジュールは、loop内で使っても、n個 – 1とかには出来ないらしく、10枚のカードから1枚選んで、また10枚の中に戻す。と言った動きになる。
member.yml
※氏名は平成21年生まれの名前ランキングから抜粋
[code]
member:
– "佐藤 優衣"
– "田中 美羽"
– "佐藤 花音"
– "鈴木 大翔"
– "吉田 悠人"
– "田中 優衣"
– "高橋 美結"
– "佐藤 愛莉"
– "鈴木 杏奈"
– "吉田 百花"
– "佐藤 翔太"
– "山口 結愛"
– "田中 大翔"
– "伊藤 悠真"
– "加藤 颯真"
– "佐藤 優成"
– "森 悠真"
– "中村 優希"
– "田中 悠翔"
– "鈴木 悠真"
table:
– A-1
– A-2
– A-3
– A-4
– A-5
– A-6
– B-1
– B-2
– B-3
– B-4
– B-5
– B-6
– C-1
– C-2
– C-3
– C-4
– C-5
– C-6
– C-7
– C-8
[/code]
lottery.py
[code]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import yaml
import random
base = os.path.dirname(os.path.abspath(__file__))
input = (os.path.join(base,’member.yml’))
f = open(imput, ‘r’)
result = yaml.load(f)
f.close()
members= (random.sample(source[‘member’],len(source[‘member’])))
tables = (source[‘table’])
for (t,m) in zip(tables,members):
print(t + ‘\t’ + m)
[/code]
[code]
(random.sample(source[‘member’],len(source[‘member’])))
[/code]
がramdomモジュールを使っている箇所で、
random.sample(配列,何個取るか?)と使う。
全メンバーを1度のみ抽出するので、len(source[‘member’])としている。
MySQLのデータをBigqueryに転送する。
固定のテーブルを送信する方法は
https://qiita.com/tashiro_gaku/items/f7fa0f1a99c759d947a7
とかに書いているけどけど、やりたかったのは
1) ログ保存テーブルは、updateカラムを見て差分でBigqueryに送信する。
2) 一部のテーブルは、全レコードBigqueryに送信する。
3) 上記、1、2の対象テーブルはconfファイルを読んで動的に動かしたい
(出来れば運用側で勝手に対象テーブルの追加、削除をやって欲しい。。。)
MakeJSON.py # jsonとyamlを生成
Execue_embulk.py # Embulk転送の実行
conf/embulk_json/ # 対象テーブルを元にBQ転送時の定義ファイルが作成される
embulk_yaml/ # 対象テーブルを元にEmbulk実行時の定義ファイルが作成される
keys/ # BQ接続時のjson_keyを置く
conf.yaml # MySQLのログイン情報、対象テーブルの情報を定義
embulk_tmp # Embulkのyaml生成で使うテンプレート
使い方
MakeJSON.pyの実行はいつでもいいがExecue_embulk.pyは前日分も送信するので、日付が変わってから実行する。
0 23 * * * python3 MakeJSON.py
30 0 * * * python3 Execue_embulk.py
SQLServerのログシッピングは、トランザクションバックアップの出力、コピー、リストアが別々のジョブで実行される。
デフォルトでログシッピングを作成した場合、15分間隔でジョブが作成されるが、MasterとSlaveのデータ差異が15分とは限らない為、Slave機で以下のクエリを流して同期状態を確認する。
[code]
SET NOCOUNT ON
USE master
/* DB名を入れる変数 */
DECLARE @dbname varchar(80);
/* DB一覧 */
DECLARE DBnameList CURSOR FOR
select name from sys.databases
/* sp_help_log_shipping_secondary_databaseの結果を入れる */
CREATE TABLE #TMP (
secondary_id nchar(128)
,primary_server nchar(128)
,primary_database nchar(128)
,backup_source_directory nchar(128)
,backup_destination_directory nchar(128)
,file_retention_period int
,copy_job_id nchar(128)
,restore_job_id nchar(128)
,monitor_server nchar(128)
,monitor_server_security_mode nchar(128)
,secondary_database nchar(128)
,restore_delay int
,restore_all int
,restore_mode int
,disconnect_users int
,block_size int
,buffer_count int
,max_transfer_size int
,restore_threshold int
,threshold_alert int
,threshold_alert_enabled int
,last_copied_file nchar(128)
,last_copied_date datetime2
,last_copied_date_utc datetime2
,last_restored_file nchar(128)
,last_restored_date datetime2
,last_restored_date_utc datetime2
,history_retention_period int
,last_restored_latency int
)
/* ループ処理開始 */
OPEN DBnameList;
FETCH NEXT FROM DBnameList INTO @dbname
WHILE (@@FETCH_STATUS = 0)
BEGIN
print @dbname
INSERT INTO #TMP EXEC sp_help_log_shipping_secondary_database @dbname
FETCH NEXT FROM DBnameList INTO @dbname
END
CLOSE DBnameList
DEALLOCATE DBnameList
/* 一覧出力 */
select
secondary_database as ‘DB名’
,last_copied_date as ‘最終コピー時刻’
,last_restored_date as ‘最終リストア時刻’
,last_restored_file as ‘最終リストアファイル名’
from #TMP
/* TMPDB削除 */
DROP TABLE #TMP
[/code]
wordpressの移設に少し手間取ったのでメモ
wordpressやELB、EC2の動かし方は割愛するが、普通のやり方。
ただ、以前に借りていたVPSでLets EncryptでHTTPS化していたブログを移設した。
ハマった所1: wp-adminのリダイレクトループ
管理画面での SSL 通信
リンク先に書いているけど、wp-includes/default-constants.phpの、
[code]
if ( !defined( ‘FORCE_SSL_ADMIN’ ) ) {
if ( ‘https’ === parse_url( get_option( ‘siteurl’ ), PHP_URL_SCHEME ) ) {
define( ‘FORCE_SSL_ADMIN’, true );
} else {
define( ‘FORCE_SSL_ADMIN’, false );
}
}
[/code]
を
[code]
if ( !defined( ‘FORCE_SSL_ADMIN’ ) ) {
if ( ‘https’ === parse_url( get_option( ‘siteurl’ ), PHP_URL_SCHEME ) ) {
define( ‘FORCE_SSL_ADMIN’, true );
if ( ! empty( $_SERVER[‘HTTP_X_FORWARDED_PROTO’] ) && $_SERVER[‘HTTP_X_FORWARDED_PROTO’] == ‘https’ ) {
$_SERVER[‘HTTPS’]=’on’;
}
} else {
define( ‘FORCE_SSL_ADMIN’, false );
}
}
[/code]
に変更する。
ハマった所2: WPやプラグイン更新のFTP設定
config.phpの末尾に、
[code]
define(‘FS_METHOD’,’direct’);
[/code]
を記載する。
Slave側のDBをログシッピングのStandbyモードで動かしている場合、
SSMSのユーザーセッションが残っているとリストアが失敗する事がある。
会社のとあるシステムでは、15分毎にLSCOPYを行い、深夜に1回、LSRESTOREジョブが動いているが、その良く失敗する。
酷い時は週5回は失敗して、「データが更新されてない!」と利用部門からクレームが来て手動でジョブを実行していた。
接続を切って帰ってくれればいいのだが、何度言ってもダメなので、
LSRESTOREジョブにステップを追加して、当該DBへのアクセスを全てkillする事にした。
その時に動いている処理があるのかもしれないが、ムシャクシャして書いた。
[code]
SET NOCOUNT ON
CREATE TABLE #sp_who (
spid smallint
,ecid smallint
,status nchar(30)
,loginame nchar(128)
,hostname nchar(128)
,blk char(5)
,dbname nchar(128)
,cmd nchar(16)
,request_id int)
INSERT INTO #sp_who EXEC sp_who
DECLARE CUR_SPID CURSOR FOR select spid from #sp_who where dbname = ‘DB名’
DECLARE @SPID nchar(5)
OPEN CUR_SPID
FETCH NEXT FROM CUR_SPID INTO @SPID
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @command nchar(128)
SET @command = N’kill ‘ + @SPID
EXEC sp_executesql @command
FETCH NEXT FROM CUR_SPID INTO @SPID
END
CLOSE CUR_SPID
DEALLOCATE CUR_SPID
DROP TABLE #sp_who
[/code]
これで、翌朝にドタバタ&イライラしなくても済みそう。
SQLServerで一時テーブルの作成とストアド結果をINSERTするやり方。
いつも忘れてしまうからメモ。
[code]
CREATE TABLE #sp_who (
spid smallint
,ecid smallint
,status nchar(30)
,loginame nchar(128)
,hostname nchar(128)
,blk char(5)
,dbname nchar(128)
,cmd nchar(16)
,request_id int)
INSERT INTO #sp_who EXEC sp_who
select * from #sp_who
DROP TABLE #sp_who
[/code]
centosでdirnameを実行すると、そんなコマンド無いよ!と怒られたのでメモ
※他のメンバーがOSインストールしたんだけど、baseだけしか入れてないのかな?
# dirname
dirname: missing operand
詳しくは `dirname –help’ を実行して下さい.
[code]
yum -y install coreutils.x86_64
[/code]
先週、SQLServer on Linuxのpublic Public Previewが開始されたので、さっそく触ってみた。
[環境]
VirtualBOX上の CentOS7
CPU :2コア
メモリ: 4096MB ※3250MB以下は、インストール時にエラーが出ます。
インストールは、公開されているリポジトリを追加してyumコマンド叩くだけ!
非常に簡単!
[code]
# リポジトリ追加
curl https://packages.microsoft.com/config/rhel/7/mssql-server.repo > /etc/yum.repos.d/mssql-server.repo
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo
# インストール
yum -y install mssql-server mssql-tools
# 途中、ライセンス確認のチェックが入るので、大文字でYESと入力
Do you accept the license terms? (Enter YES or NO) YES
[/code]
インストールPATHは/opt配下。
[code]
ls -1 /opt/
microsoft → odbcドライバ
mssql → SQLServer
mssql-tools → bcpとsqlcmd
[/code]
続いて、初期セットアップを行う。
[code]
/opt/mssql/bin/sqlservr-setup
(中略)
Setting system administrator (SA) account password…
Do you wish to start the SQL Server service now? [y/n]: y
Do you wish to enable SQL Server to start on boot? [y/n]: y
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server-telemetry.service to /usr/lib/systemd/system/mssql-server-telemetry.service.
Setup completed successfully.
[/code]
セットアップスクリプトが動いたっぽい。
プロセスも動いている!
mssql 2257 1 2 18:37 ? 00:00:00 /opt/mssql/bin/sqlservr
mssql 2263 1 0 18:37 ? 00:00:00 /opt/mssql/bin/sqlservr-telemetry /var/opt/mssql/.system
mssql 2270 2257 43 18:37 ? 00:00:04 /opt/mssql/bin/sqlservr
ポートも空いている!
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1433 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:1434 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
最後にSSMSで接続してみます。
当然、Windows認証は使えませんが、セットアップ時に決めたSAのパスワードで接続する事が出来ました。
Versionは、
Microsoft SQL Server vNext (CTP1) – 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (CentOS Linux 7 (Core))
と出ているので、インストール自体は成功したようです。