Skip to content

Instantly share code, notes, and snippets.

@yano3nora
Last active June 14, 2019 06:05
Show Gist options
  • Save yano3nora/da8437c7f940857a5dbcb3186b9db3d4 to your computer and use it in GitHub Desktop.
Save yano3nora/da8437c7f940857a5dbcb3186b9db3d4 to your computer and use it in GitHub Desktop.
[win: Windows Server] Windows Server note. #win #dev

OVERVIEW

みんな大好き Microsoft 製のサーバ OS 。現在 2019 が最新バージョンだが、リリースしたてなので 2016 バージョンの情報がメイン。Package 管理には Chocolatey を利用すると良い ( 別 Gist 参照 ) 。

Commands

Windows Commands - docs.microsoft.com

PowerShell とコマンドプロンプト ( cmd.exe ) で若干違うので注意。PowerShell コマンドは基本 cmd.exe や GNU 系コマンドのエイリアスを用意してくれているが where など名前被りがあったりしてややこしい。最近発表された Windows Terminal ではこのあたりちゃんと統一される ... らしい。

# 新規ファイル追加
$ ni .gitignore  # PowerShell

# PATH 確認
$ where notepad     # cmd.exe
$ gcm notepad | fl  # PowerShell

# 疎通
$ ping /a 10.0.99.221

# 名前解決
$ nslookup www.google.com

# ネットワークアダプタ
$ ipconfig /all
$ ipconfig /flushdns
$ ipconfig /renew

# ネットワーク状態
$ netstat

# ネットワーク管理
$ netsh

# レジストリ
$ reg add HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead

# シンボリックリンク
$ mklink /d \MyFolder \Users\User1\Documents  # cmd.exe

Using PowerShell v6 for charactor encoding

PowerShell 6.0 からファイル出力に関わるエンコーディングが変わります
powershell-core - chocolatey.org/packages

Windows PowerShell はデフォルトの出力文字コードが UTF-16 に、コマンドプロンプトは Shift-JIS になっている。このためサーバ設定でよくある UTF8 系のファイル操作 ( とくに |> など ) が鬼面倒。ファイル出力系のコマンド out-file などは -encoding で文字コードを指定できるからまだ良いが、リダイレクトやパイプなどは Linux で当然のようにできるプロビジョニングのワンライナー / スクリプティングが出来ない。

これについて PowerShell 6.0 よりデフォルトのファイル出力エンコーディングが BOM なし UTF-8 に変更 されている。上記した -encoding も指定せずともデフォルトで UTF-8 になってくれるため、ファイル操作をするなら Chocolatey で PowerShell 6.0 インストールしてそっちを利用した方がよい。但し PowerShell Core ( 6.0~ ) はリリースして間もなく OS 標準ではないため いくつかの OS 依存コマンドに接続できない ので注意。この場合は旧来の PowerShell を利用すること。

# インストール
$ choco install powershell-core --version=6.2.1 -y

# PowerShell 6 の実行
# 毎回以下を叩いて入るのは面倒なのでショートカットでも置いとけ
#
$ pwsh.exe
$ $PSVersionTable
> PSVersion 6.2.1

# 以下は UTF-8 でリダイレクトされている
$ echo 'はろー' > c:/hello.txt
$ helloTxt = New-Object System.IO.StreamReader('c:/hello.txt')
$ helloTxt.CurrentEncoding  # utf-8

# $OutputEncoding, [Console]::OutputEncoding など
# コンソールに出す時のエンコードはこれまで通り ( UTF-16, Shift-JIS )
# これらを変更したい場合は以下、いずれもターミナル再起動後に戻る
#
$OutputEncoding            = [System.Text.Encoding]::UTF8
$[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

SSH で Windows Server に入る

とりあえず Chocolatey で openssh をインストールしてサービス起動。以下のように SSHServerFeature パラメータ付きでインストールすると Services に sshd が Status: Running Startup Type: Automatic で自動登録される。

$ choco install openssh -params '"/SSHServerFeature"' -y

Windows のコンソール出力が Shift-JIS ( 厳密には cp932 ) な関係で、OpenSSH を利用して SSH でログインしたりすると Win 側シェルからの標準出力返却をターミナルが解釈できず文字化ける ので注意。以下コマンドで「現在のターミナルセッションでは標準出力を UTF8 にしろ」って言わないといけない。

加えて、Win 側の sshd はなんかツールを導入するたびに net stop sshd net start sshd で再起動かけないと PATH の変更などを読み取ってくれないのでかったるい。

# ログイン
$ ssh user@host
> password...

# 文字コードまともなのにして
$ chcp 65001  # UTF-8

Windows Update

Windows 10 / Windows Server 2016 でも Windows Update の自動更新は止められます
Windows 10 の Windows Update の自動更新設定

Windows Update の無効化手順。

  1. CLI で gpedit.msc を実行しグループポリシーダイアログを開く
  2. コンピューターの構成 > 管理用テンプレート > Windows コンポーネント > Windows Update へ移動
  3. 自動更新を構成する / Configure Automatic Updates をダブルクリック
  4. 無効化 / Disabled を適用
  5. CLI で gpupdate /force を実行

netsh x Windows Firewall

Windows ファイアウォール
ファイアウォールの(受信)規則をコマンドで追加したい

# 80, 443 を空ける例
$ netsh advfirewall firewall add rule \
  name="http/https" description="Allow HTTP/HTTPS" \
  dir=in action=allow protocol=tcp localport=80,443

# 以下利用可能なパラメータ、省略時は基本「any, yes」など全開放に寄せられる
#
# dir        必須 - 受信 in / 送信 out
# action     必須   許可 allow / 拒否 block
# protocol   任意   tcp, udp, IPv6, ICMPv6, ICMPv4, IGMP, GRE
# localport         protocol が tcp か udp 時に指定する受信ポート
# remoteport        protocol が tcp か udp 時に指定する送信元ポート
# profile    任意   public, domain, private
# program    任意   ルールを適用するプログラム名
# remoteip   任意   接続先の IP アドレス制限
# enable     任意   ルールの有効 yes / 無効 no

Install Apache x PHP

# Install
$ choco install apache-httpd --version=2.4.39 -y --params '"/port:80"'
$ choco install php --version=7.2 -y --params '"/ThreadSafe"'

# Setting Apache.
$ cd ~/Appdata/Roaming/Apache24/conf
$ copy httpd.conf httpd_backup.conf
$ (gc httpd.conf).replace('${SRVROOT}/htdocs','c:/path/to/public') | set-content httpd.conf
$ (gc httpd.conf).replace('Listen 8080','Listen 80') | set-content httpd.conf
$ (gc httpd.conf).replace('ServerName localhost:80','ServerName www.example.com') | set-content httpd.conf
$ (gc httpd.conf).replace('DirectoryIndex index.html','DirectoryIndex index.php index.html') | set-content httpd.conf
$ (gc httpd.conf).replace('AllowOverride none','AllowOverride All') | set-content httpd.conf
$ (gc httpd.conf).replace('AllowOverride None','AllowOverride All') | set-content httpd.conf
$ (gc httpd.conf).replace('Options Indexes','Options ') | set-content httpd.conf
$ (gc httpd.conf).replace('ServerSignature On','ServerSignature Off') | set-content httpd.conf
$ (gc httpd.conf).replace('Include conf/extra/httpd-ahssl.conf','#Include conf/extra/httpd-ahssl.conf') | set-content httpd.conf
$ (gc httpd.conf).replace('#Include conf/extra/httpd-ssl.conf','Include conf/extra/httpd-ssl.conf') | set-content httpd.conf
$ (gc httpd.conf).replace('#LoadModule rewrite_module modules/mod_rewrite.so','LoadModule rewrite_module modules/mod_rewrite.so') | set-content httpd.conf
$ 'ServerTokens Prod' | add-content httpd.conf
$ 'EnableSendfile off' | add-content httpd.conf
$ 'EnableMMAP off' | add-content httpd.conf
#
## PHP Module の有効化
$ 'AddHandler application/x-httpd-php .php' | add-content httpd.conf
$ 'AddType application/x-httpd-php .php .html' | add-content httpd.conf
$ 'LoadModule php7_module "C:/tools/php72/php7apache2_4.dll"' | add-content httpd.conf
$ 'PHPIniDir "C:/tools/php72"' | add-content httpd.conf
#
# HTTPS
$ cp extra/httpd-ssl.conf extra/httpd-ssl_backup.conf
$ (gc extra/httpd-ssl.conf).replace('${SRVROOT}/htdocs','c:/path/to/public') | set-content extra/httpd-ssl.conf
$ (gc extra/httpd-ssl.conf).replace('www.example.com','www.your-domain.com') | set-content extra/httpd-ssl.conf
$ (gc extra/httpd-ssl.conf).replace('${SRVROOT}/conf/server','c:/path/to/credential') | set-content extra/httpd-ssl.conf
#
# php.ini 編集
$ cd C:\tools\php72\
$ copy php.ini backup.php.ini
$ 'mbstring.detect_order = auto' | add-content php.ini
$ 'mbstring.http_input = auto' | add-content php.ini
$ 'mbstring.internal_encoding = UTF-8' | add-content php.ini
$ 'mbstring.language = Japanese' | add-content php.ini
$ 'date.timezone ="Asia/Tokyo"' | add-content php.ini
$ 'extension=php_curl.dll' | add-content php.ini
$ 'extension=php_gd2.dll' | add-content php.ini
$ 'extension=php_fileinfo.dll' | add-content php.ini
$ 'extension=php_openssl.dll' | add-content php.ini
$ 'extension=php_mbstring.dll' | add-content php.ini
$ 'extension=php_mysqli.dll' | add-content php.ini
$ 'extension=php_pdo_mysql.dll' | add-content php.ini
$ (gc php.ini).replace('display_errors = Off','display_errors = On') | set-content php.ini
$ (gc php.ini).replace('expose_php = On','expose_php = Off') | set-content php.ini
$ (gc php.ini).replace('memory_limit = 128M','memory_limit = 512M') | set-content php.ini
$ (gc php.ini).replace('upload_max_filesize = 2M','upload_max_filesize = 100M') | set-content php.ini
$ (gc php.ini).replace('post_max_size = 8M','post_max_size = 120M') | set-content php.ini
#
# Apache 起動 / 停止
$ net stop apache
$ net start apache

openssl

# Install openssl.
$ choco install openssl.light -y

# Generate self credentials for dev.
$ cd c:/
$ mkdir credentials
$ cd c:/credentials
$ openssl genrsa 2048 > development.key
$ openssl req -new -key development.key > development.csr
$ openssl x509 -days -36500 -req -signkey development.key -in development.csr > development.crt

Reg

【Windows 10対応】regコマンドを使ってコマンドプロンプトからレジストリを操作する

# レジストリキーを確認する
$ Reg Query HKLM\SYSTEM\...\ /v KeyName

# レジストリキーを追加・もしくは値を変更する
#
# /v Value Name
# /t Value Type
# /d Value Data
# /f Force change
#
$ Reg Add HKLM\SYSTEM\...\ /v KeyName /t REG_DWORD /d 1

sconfig でリモートデスクトップの有効化

2016 の Server Core で RDP を有効化する

$ sconfig
$ 7
$ E

SQL SERVER

SQL Server は Windows 認証モードと SQL 認証モードがあり、デフォルトは Windows 認証モード。アプリケーションから接続する場合 Windows 認証モードで運用することは考えられないので変更し DB_DATABASE, DB_USERNAME, DB_PASSWORD それぞれちゃんと作っておく必要がある。

Install

$ choco install sql-server-2017 -y

# PHP から SQL Server への接続ドライバ / 拡張設定はデフォルトで入っていないため
# 公式から別途 dll を DL して extension を追加したりしないといけない
# https://docs.microsoft.com/ja-jp/sql/connect/php/microsoft-php-driver-for-sql-server?view=sql-server-2017
#
$ cp php_sqlsrv_72_ts_x64.dll c:/tools/php72/ext/php_sqlsrv_72_ts_x64.dll
$ cp php_pdo_sqlsrv_72_ts_x64.dll c:/tools/php72/ext/php_pdo_sqlsrv_72_ts_x64.dll
$ 'extension=php_sqlsrv_72_ts_x64.dll' | add-content c:/tools/php72/php.ini
$ 'extension=php_pdo_sqlsrv_72_ts_x64.dll' | add-content c:/tools/php72/php.ini

# 認証モードの変更 ( レジストリキー変更 )
$ $INSTANCE_NAME = MSSQL14.MSSQLSERVER  # 動的なので注意
$ net stop MSSQLSERVER
$ reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\${INSTANCE_NAME}\MSSQLServer' /v LoginMode /t REG_DWORD /d 2
$ net start MSSQLSERVER

Launch

# Start
$ net start MSSQLSERVER

# Stop
$ net stop MSSQLSERVER

sqlcmd

# sqlcmd の PATH 通ってないときは大体以下にいる
$ ls /opt/mssql-tools/bin/sqlcmd
$ ln -sfn /opt/mssql-tools/bin/sqlcmd /usr/bin/sqlcmd
# Login.
# Windows 認証モードなら Windows にログイン中はこれだけで通る
#
$ sqlcmd
#
# SQL ユーザ認証ならこっち
# サーバは localhost では NG で自身参照なら 127 ... でポートは , つなぎ
# Listen ポート 1433 がデフォらしいが自環境では 1434 だった謎
#
$ sqlcmd -S 127.0.0.1,1434 -U user -P password -d database

# Create database.
$ create database my_db;
$ go

# Verify databases.
$ select name from sys.databases;
$ go

# Create login & user.
# なんかログイン方法を作ってユーザに割り当てるという意味不明な仕様
#
$ create login my_login with password = 'xxxx', default_database = my_db;
$ go
$ use my_db;
$ go
$ create user my_user for login my_login;
$ go
$ use master;
$ go
$ alter login enable my_user;
$ go

# Verify server using port.
$ use master;
$ go
$ xp_readerrorlog 0, 1, N'Server is listening on';
$ go

IIS

# サービスの起動 / 停止
$ iisreset /restart
$ iisreset /start
$ iisreset /stop

# ポート変更
# PowerShell < 6 で実行すること
# 以下は 80 ポートを空けていた IIS のポートバインドを 8080 へ変更する例
#
$ set-webBinding -name 'Default Web Site' -bindinginformation "*:80:" -propertyname Port -value 8080
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment