【Subversionサーバ】Subversion導入

  • Subversion導入

    apt-get install subversion subversion-tools libapache2-svn
    

    subversion:Subversion本体
    subversion-tools:バックアップコマンドが利用できたりするツール
    libapache2-svn:Apache2とSubversionの連携用

    Subversionの設定を変更します。

    vi /etc/subversion/config
    
    下記内容を変更
    # クライアントの改行コードをサーバで統一
    # enable-auto-props = yes
    ↓
    enable-auto-props = yes
    

    Subversionのリポジトリを作成します。

    mkdir /var/www/svn
    svnadmin create /var/www/svn/z-test
    chown -R www-data.www-data /var/www/svn/z-test
    

    外部から接続するため、ユーザIDとパスワードを設定します。

    htpasswd -c /etc/apache2/dav_svn.passwd ユーザー名
    New password:パスワード
    Re-type new password:パスワード
    Adding password for user ユーザー名
    

    Apache2とSubversionを繋ぐための設定をします。
    また、Subersionには直接アクセス、WebDAV、SVNの3つのプロトコルのうち、
    WebDAVでBasic認証で試します。

    vi /etc/apache2/mods-enabled/dav_svn.conf
    
    # 下記内容を最終行に追加
    <Location /svn>
        DAV svn
        SVNParentPath /var/www/svn
    
        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile /etc/apache2/dav_svn.passwd
        AuthzSVNAccessFile /etc/apache2/dav_svn.authz
        Require valid-user
    </Location>
    

    権限ファイルにユーザを追加します。

    vi /etc/apache2/dav_svn.authz
    
    # 下記内容を追加
    # z-testより下は追加ユーザであればRead、Write可能
    # それ以外はRead、Write不可
    [z-test:/]
    manager = ユーザー名
    [/]
    * =
    @manager = rw
    

    モジュールを有効化します。

    a2enmod authz_svn
    
    Considering dependency dav_svn for authz_svn:
    Considering dependency dav for dav_svn:
    Module dav already enabled
    Module dav_svn already enabled
    Enabling module authz_svn.
    To activate the new configuration, you need to run:
      service apache2 restart
    

    記載の通り、Apache2を再起動します。

    service apache2 restart
    

    最後にSubversionにはhttpsで強制的に接続するため、「.htaccess」を追加します。

    vi /var/www/svn/.htaccess
    
    # 下記内容を追加
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </IfModule>
    
    chown -R www-data.www-data /var/www/svn/.htaccess
    

    「https://z-area.net/svn/z-test/」で接続し、ログインすればリポジトリを参照可能。

【WordPress】WordPressSSL導入

  • WordPressSSL導入

    vi /var/www/z-blog/wp-config.php
    
    # 下記内容を「編集が必要なのはここまで(略)」より上に追加
    /* ログイン・管理画面SSL強制 */
    define('FORCE_SSL_LOGIN', true);
    define('FORCE_SSL_ADMIN', true);
    

    自身でURLをhttpsに変更すればログインはできましたが、
    上記を設定しただけではログイン画面を表示しても強制的にhttpsに切り替わりませんでした。
    そこで「.htaccess」にリダイレクトを記載してみます。

    vi /var/www/z-blog/.htaccess
    
    # BEGIN WordPressの上に下記内容を追加
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /(.*) HTTP/ [NC]
    RewriteCond %{HTTPS} !=on [NC]
    RewriteRule ^/?(wp-admin/|wp-login.php) https://z-area.net%{REQUEST_URI}%{QUERY_STRING} [R=301,QSA,L]
    

    設定後にログイン画面を表示したら、強制的にhttpsに切り替わりました。
    不思議なのは「.htaccess」の内容を消しても強制的にhttpsに切り替わり続けるようになったこと。
    不都合ないので気にしないことにしました。

【WEBサーバ】Apache2SSL導入

Apache2にSSLを導入し、httpsで接続できるようにします。

  • OpenSSL設定
    「/etc/ssl/openssl.cnf」が存在していたので
    OpenSSLはインストール済のようなので、設定だけ行います。

    vi /etc/ssl/openssl.cnf
    
    # [ usr_cert ] 付近を下記内容に変更
    #nsCertType                      = server
    ↓
    nsCertType                      = server
    
    # [ v3_ca ]付近を下記内容に変更
    #nsCertType = sslCA, emailCA
    ↓
    nsCertType = sslCA, emailCA
    
  • オレオレ認証局作成

    cd /usr/local/
    mkdir certs
    cd certs
    /usr/lib/ssl/misc/CA.pl -newca
    
    #Enterすれば作成されると書いてあるので、何も入力せずEnter
    CA certificate filename (or enter to create)
    ...................................+++
    .............+++
    writing new private key to './demoCA/private/cakey.pem'
    # パスワード入力
    Enter PEM pass phrase:
    # パスワード再入力
    Verifying - Enter PEM pass phrase:
    
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    
    # JPを入力
    Country Name (2 letter code) [AU]:
    # Tokyoを入力
    State or Province Name (full name) [Some-State]:
    # Akihabaraを入力
    Locality Name (eg, city) []:
    # Praicate_CAを入力
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    # 何も入力せずEnter
    Organizational Unit Name (eg, section) []:
    # z-area.net
    Common Name (e.g. server FQDN or YOUR name) []:
    # 何も入力せずEnter
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    # 何も入力せずEnter
    A challenge password []:
    # 何も入力せずEnter
    An optional company name []:
    
    Using configuration from /usr/lib/ssl/openssl.cnf
    # パスワード再々入力
    Enter pass phrase for ./demoCA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
    ~(略)~
    Certificate is to be certified until Sep  3 14:39:36 2017 GMT (1095 days)
    Write out database with 1 new entries
    Data Base Updated
    

    オレオレ認証局が出来たので、次に秘密鍵を作成します。

  • 秘密鍵作成

    openssl genrsa -out server.key 1024
    
    Generating RSA private key, 1024 bit long modulus
    ...................................+++
    .............+++
    e is 65537 (0x10001)
    

    秘密鍵が作成できたので、次に公開鍵を作成します。

  • 公開鍵作成

    openssl req -new -key server.key -out server.csr
    

    先ほどオレオレ認証局を作成したときと同じ値を入力する。

    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    # JPを入力
    Country Name (2 letter code) [AU]:
    # Tokyoを入力
    State or Province Name (full name) [Some-State]:
    # Akihabaraを入力
    Locality Name (eg, city) []:
    # Pravate_CAを入力
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    # 何も入力せずEnter
    Organizational Unit Name (eg, section) []:
    # z-area.net
    Common Name (e.g. server FQDN or YOUR name) []:
    # 何も入力せずEnter
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    # 何も入力せずEnter
    A challenge password []:
    # 何も入力せずEnter
    An optional company name []:
    

    公開鍵が作成できたので、最後にオレオレ証明書を作成する。

  • オレオレ証明書作成
    証明書のシリアルナンバーを発行する。

    # シリアルナンバー01で発行
    echo 01 > demoCA/ca-cert.srl
    # -days 3650 は有効日数なので10年
    openssl x509 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAserial ./demoCA/ca-cert.srl -req -days 3650 -in server.csr -out server.crt
    
    Signature ok
    subject=/C=JP/ST=Tokyo/L=Akihabara/O=Private_CA/CN=z-area.net
    Getting CA Private Key
    # パスワード再々々入力
    Enter pass phrase for ./demoCA/private/cakey.pem:
    
    ls
    demoCA  server.crt  server.csr  server.key
    

    demoCA:オレオレ認証局
    server.crt:オレオレ証明書
    server.csr:公開鍵
    server.key:秘密鍵

  • Apache2SSL設定
    Apache2のSSL設定とSSLモジュールを有効にする。

    /etc/apache2/a2ensite default-ssl
    
    Enabling site default-ssl.
    To activate the new configuration, you need to run:
      service apache2 reload
    
    /etc/apache2/a2enmod ssl
    
    Enabling module ssl.
    See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
    To activate the new configuration, you need to run:
      service apache2 restart
    
    vi /etc/apache2/sites-enabled/default-ssl
    
    # ServerAdminの上に下記内容を追加
    ServerName z-area.net
    
    # 下記内容を変更
    SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
    ↓
    SSLCertificateFile    /usr/local/certs/server.crt
    
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    ↓
    SSLCertificateKeyFile /usr/local/certs/server.key
    
    # 下記内容を変更(「/var/www/」の子要素)
    Options Indexes FollowSymLinks MultiViews
    ↓
    Options -Indexes FollowSymLinks -MultiViews
    
    # .hatcessファイル制御(単純にAllで良いのかは要検討)
    AllowOverride None
    ↓
    AllowOverride All
    
    service apache2 restart
    
  • ファイアウォール設定

    ufw allow 443
    # yを入力
    Command may disrupt existing ssh connections. Proceed with operation (y|n)?
    Firewall is active and enabled on system startup
    ufw status
    

    ToActionFrom
    20LIMITAnywhere
    21LIMITAnywhere
    22LIMITAnywhere
    80ALLOWAnywhere
    8080ALLOWAnywhere
    443ALLOWAnywhere

    「https://z-area.net/」でHTTPS接続でIt Works!が表示されれば成功。
    ルータでもポート443を開放後に外からも接続確認。

【Raspbian】Raspberry Pi性能向上

Raspberry Piに無理をさせているので、
ちょっとでもパフォーマンスをアップさせます。

  • GPUメモリ割り当て変更

    raspi-config
    

    「8. Advanced Option」を選択。
    「A3 Memory Split」を選択。
    GPUメモリ割り当てを16に変更。

  • 仮想端末無効化
    6つも仮想端末が立ち上がるようになっていますが、
    ログインする人はSSHで本人のみなので、5つをコメントアウトします。

    vi /etc/inittab
    
    1:2345:respawn:/sbin/getty  noclear 38400 tty1
    #2:23:respawn:/sbin/getty 38400 tty2
    #3:23:respawn:/sbin/getty 38400 tty3
    #4:23:respawn:/sbin/getty 38400 tty4
    #5:23:respawn:/sbin/getty 38400 tty5
    #6:23:respawn:/sbin/getty 38400 tty6
    

【FTPサーバ】FTP導入

ポートは空けないので外からは接続できませんが、
ローカルではFTPでも問題ないので導入してみます。

  • FTP導入

    apt-get install vsftpd
    service vsftpd stop
    vi /etc/vsftpd.conf
    
    # 下記内容を変更
    # 匿名ユーザ拒否
    anonymous_enable=YES
    ↓
    anonymous_enable=NO
    
    # ローカルユーザ許可
    #local_enable=YES
    ↓
    local_enable=YES
    
    # 書き込み許可
    #write_enable=YES
    ↓
    write_enable=YES
    
    # ファイル作成時のパーミッション755
    #local_umask=022
    ↓
    local_umask=022
    
    # アスキーでアップロード許可
    #ascii_upload_enable=YES
    ↓
    ascii_upload_enable=YES
    
    # アスキーでダウンロード許可
    #ascii_download_enable=YES
    ↓
    ascii_download_enable=YES
    
    # ホームディレクトリより上へのアクセス制御にchrootリストファイルを利用
    #chroot_local_user=YES
    ↓
    chroot_local_user=YES
    
    # chrootリストファイルを有効
    #chroot_list_enable=YES
    ↓
    chroot_list_enable=YES
    
    # chrootリストファイル配置場所
    #chroot_list_file=/etc/vsftpd.chroot_list
    ↓
    chroot_list_file=/etc/vsftpd.chroot_list
    
    # 下記内容を最終行に追加
    # FTP接続制御リストファイル有効
    userlist_enable=YES
    # FTP接続制御リストファイルに追加されていないユーザ拒否
    userlist_deny=NO
    # FTP接続制御リストファイル配置場所
    userlist_file=/etc/vsftpd.user_list
    

    chrootリストファイルとFTP接続制御リストファイルに
    自身のユーザ名を追加し、FTP再起動。

    vi /etc/vsftpd.chroot_list
    vi /etc/vsftpd.user_list
    service vsftpd start
    

【WordPress】WordPress設定

Raspberry Piはいつ壊れるか不安なので、
再インストールを見越してWordPressの設定メモ。

  • 外観-テーマ
    Paramentを入れました。
  • 外観-ウィジェット
    最近のコメントと最近の投稿を使用停止。
  • 外観-テーマ編集
    style.cssの編集で最終行に下記内容を追加

    .form-allowed-tags {
    	display:none !important;
    }
    
  • プラグイン-インストール済のプラグイン
    TablePressを導入。
    TablePressのプラグインのオプションでテーマにあうようにカスタムCSSを設定。

    .tablepress thead th {
    	font-size: 10pt !important;
    	color: #989eae !important;
    	text-align: center !important;
    	background-color: #202228 !important;
    	padding: 5px !important;
    	border-width: 1px !important;
    	border-style: solid !important;
    	border-color: #444855 !important;
    }
    
    .tablepress tbody td {
    	font-size: 10pt !important;
    	color: #989eae !important;
    	text-align: left !important;
    	background-color: #202228 !important;
    	padding: 5px !important;
    	border-width: 1px !important;
    	border-style: solid !important;
    	border-color: #444855 !important;
    }
    
  • プラグイン-インストール済のプラグイン
    SyntaxHighlighter Evolvedを導入。
    SyntaxHighlighterのバージョンは2.xを選択。
    テーマはEmacsを選択。
  • ユーザー-あなたのプロフィール
    「ビジュアルリッチエディターを使用しない」にチェック。
  • 設定-一般設定
    新規ユーザーのデフォルト権限グループを「投稿者」に設定。
    日付のフォーマットを「YYYY/MM/DD」に設定。
    時刻フォーマットを「HH24:MI」に設定。
  • 設定-表示設定
    1ページに表示する最大投稿数を「5」に設定。
    RSS/Atom フィードで表示する最新の投稿数を「5」に設定。
  • 設定-ディスカッション
    投稿のデフォルト設定のチェックを全て外す。
    自分宛のメール通知のチェックを全て外す。
  • 設定-パーマリンク設定
    日付と投稿名を選択。
    カスタム構造で「/%year%/%monthnum%/%day%/」を設定したところ、
    この内容では記事が一意に特定できないため、プレビュー機能が利用できませんでした。
    1日に何回も記事投稿しないから全く気付かず、だいぶ迷走しました。

    パーマリンク設定を行うと自動で「.htaccess」が作成され、
    中身を見てみると「mod_rewrite.c」というモジュールが呼ばれいるので、
    モジュールを有効化します。

    # モジュール有効
    a2enmod rewrite
    service apache2 restart
    

    既に有効になっている場合は「Module rewrite already enabled」と表示されます。

【WordPress】WordPress導入

WorldPressを初期ディレクトリ(wordpress)以外に
リビジョン機能を無効にした状態でインストールします。

  • WordPress導入

    cd /var/www
    wget http://ja.wordpress.org/latest-ja.zip
    unzip latest-ja.zip
    # wordpressというディレクトリで展開されますが、気分で変更
    mv wordpress/ 任意ディレクトリ名
    # ディレクトリに権限付与
    chown -R www-data.www-data 任意ディレクトリ名/
    cd 任意ディレクトリ名
    # wp-config.phpをサンプルからコピーして作成
    cp -pi wp-config-sample.php wp-config.php
    vi wp-config.php
    
    # 下記内容を変更
    define('DB_NAME', 'database_name_here');
    ↓
    define('DB_NAME', 'DB名');
    
    define('DB_USER', 'username_here');
    ↓
    define('DB_USER', 'DBユーザ名');
    
    define('DB_PASSWORD', 'password_here');
    ↓
    define('DB_PASSWORD', 'DBパス');
    
    # 下記内容を「編集が必要なのはここまで(略)」より上に追加
    /* リビジョン無効 */
    define('WP_POST_REVISIONS', false);
    

下記URLにアクセスする。
http://z-area.net/任意ディレクトリ名/wp-admin/install.php

初期設定後にログインすると記事を投稿できるようになります。
初期設定画面が出てこない場合、下記設定を一時的に変更する。

vi /etc/apache2/sites-available/default
# 下記内容を変更(「/var/www/」の子要素)
Options -Indexes FollowSymLinks -MultiViews
↓
Options Indexes FollowSymLinks -MultiViews
service apache2 restart

WordPress導入後は設定を元に戻しておきます。

【DBサーバ】MySQL導入

  • MySQL導入

    apt-get install mysql-server
    

    rootのパス入力を求められるので2回入力。
    インストール後に文字コードの設定を行う。

    vi /etc/mysql/my.cnf
    
    # 下記内容を追加([mysqld]に)
    # クライアントの文字コードに依存しない
    skip-character-set-client-handshake
    # 文字コード
    character-set-server=utf8
    

    MySQL導入が完了したらWordPress用にDBとDBユーザを作成する。

    mysql -u root -pパスワード
    
    mysql> create database DB名;
    mysql> grant all privileges on DB名.* to DBユーザ名@localhost identified by "DBパス";
    mysql> flush privileges;
    
  • MySQLの文字コード
    DBはUTF-8を基本とした方が良いようです。
    UTF-8の設定をせずにDBを作成している場合、alter文で強制的に変更。

    mysql> alter database DB名 character set utf8;
    

    文字コードの確認を行う場合、下記SQL文で確認。

    mysql> show variables like 'char%';
    

    character_set_filesystemとcharacter_sets_dir以外がUTF-8になっていれば問題なし。

【PHP】php5導入

WordPressを公開するためにphp5とMySQLを導入します。

  • php5導入

    # php本体
    apt-get install php5
    # php高速化:気持ち的に
    apt-get install php-apc
    # phpライブラリ(cURL):本当に必要か謎
    apt-get install php5-curl
    # phpライブラリ(gd):本当に必要か謎
    apt-get install php5-gd
    # phpライブラリ(mysql):必須
    apt-get install php5-mysql
    
  • MySQL導入

    apt-get install mysql-server
    

    rootのパス入力を求められるので2回入力。
    インストール後に文字コードの設定を行う。

    vi /etc/mysql/my.cnf
    
    # 下記内容を追加([mysqld]に)
    # クライアントの文字コードに依存しない
    skip-character-set-client-handshake
    # 文字コード
    character-set-server=utf8
    

    MySQL導入が完了したらWordPress用にDBとDBユーザを作成する。

    mysql -u root -pパスワード
    
    mysql> create database DB名;
    mysql> grant all privileges on DB名.* to DBユーザ名@localhost identified by "DBパス";
    mysql> flush privileges;
    
  • MySQLの文字コード
    DBはUTF-8を基本とした方が良いようです。
    UTF-8の設定をせずにDBを作成している場合、alter文で強制的に変更。

    mysql> alter database DB名 character set utf8;
    

    文字コードの確認を行う場合、下記SQL文で確認。

    mysql> show variables like 'char%';
    

    character_set_filesystemとcharacter_sets_dir以外がUTF-8になっていれば問題なし。

【WEBサーバ】Apache2ログ設定

現場ではログはデイリーなのでどうやってるのかということで設定お試しです。
さらにログ解析した際、エクセルでやらされた覚えがありますが、
やはりツールがあるようなのでお試しです。

  • Apache2ログローテーション

    vi /etc/apache2/sites-available/default
    
    # 下記内容を変更
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ↓
    #CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    # 下記内容を追加
    # XXは固定化したいIPによって変更
    # ownlog:自身のアクセスログ ⇒ access_own.log に出力
    # robotlog:検索ロボットのアクセスログ ⇒ access_robot.log に出力
    # nolog:自身と検索ロボット以外のアクセスログ ⇒ access.log に出力
    SetEnvIf Remote_Addr "192.168.XX." ownlog nolog
    SetEnvIf Remote_Addr "127.0.0.1" ownlog nolog
    SetEnvIf User-Agent "Googlebot" robotlog nolog
    SetEnvIf User-Agent "bingbot" robotlog nolog
    SetEnvIf User-Agent "MJ12bot" robotlog nolog
    SetEnvIf User-Agent "YahooFeedSeeker" robotlog nolog
    SetEnvIf User-Agent "ichiro/mobile goo" robotlog nolog
    SetEnvIf User-Agent "360Spider" robotlog nolog
    SetEnvIf User-Agent "SurveyBot" robotlog nolog
    SetEnvIf User-Agent "ia_archiver" robotlog nolog
    SetEnvIf Remote_Addr "208.43.225.84" robotlog nolog
    SetEnvIf Remote_Addr "208.43.225.85" robotlog nolog
    SetEnvIf User-Agent "crowler" robotlog nolog
    CustomLog ${APACHE_LOG_DIR}/access_own.log common env=ownlog
    CustomLog ${APACHE_LOG_DIR}/access_robot.log combined env=robotlog
    CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog
    
    vi /etc/logrotate.d/apache2
    
    # 下記内容を変更
    weekly
    ↓
    daily
    
    rotate 52
    ↓
    rotate 90
    

    1日単位でログをローテーションするよう変更したため、
    新規ファイルをログフォルダで作成できるようログ権限を変更する。

    chmod 605 /var/log/apache2
    
  • webalizer導入
    webalizerによるアクセスログの解析を行います。
    解析対象は下記の通り。
    1.自身と検索ロボット以外のアクセスログ
    2.検索ロボットのアクセスログ

    apt-get install webalizer
    # インストール時に自動作成された「/var/www/webalizer」は1のアクセスログ用
    # 2のアクセスログ用フォルダを作成
    mkdir /var/www/webalizer/robot
    # 1のアクセスログ解析ファイルを編集
    vi /etc/webalizer/webalizer.conf
    
    # 下記内容を変更
    # Incremental no
    ↓
    Incremental yes
    
    # 下記内容を追加
    HTMLHead <META HTTP-EQUIV="content-Type" CONTENT="text/html; charset=UTF-8">
    
    # 1のアクセスログ解析ファイルをコピーして2のアクセスログ解析ファイルを作成
    cp -pi /etc/webalizer/webalizer.conf /etc/webalizer/robot.conf
    vi /etc/webalizer/robot.conf
    
    # 下記内容を変更
    LogFile /var/log/apache2/access.log.1
    ↓
    LogFile /var/log/apache2/access_robot.log.1
    
    OutputDir /var/www/webalizer
    ↓
    OutputDir /var/www/webalizer/robot
    

    既に出力済のアクセスログがあれば、過去分を解析する。

    webalizer -c /etc/webalizer/webalizer.conf /var/log/apache2/access.log
    webalizer -c /etc/webalizer/robot.conf /var/log/apache2/access_robot.log
    

    アクセスログ解析結果はHTMLで参照する。
    1.http://z-area.net/webalizer/
    2.http://z-area.net/webalizer/robot/

    現状のままでは、誰でもアクセスログ解析結果を参照できてしまうので制御する。

    vi /var/www/webalizer/.htaccess
    
    # 下記内容を追加
    # XXは固定化したいIPによって変更
    order deny,allow
    deny from all
    allow from 192.168.XX.
    allow from 127.0.0.1
    allow from localhost
    
    vi /var/www/webalizer/robot/.htaccess
    
    # 下記内容を追加
    # XXは固定化したいIPによって変更
    order deny,allow
    deny from all
    allow from 192.168.XX.
    allow from 127.0.0.1
    allow from localhost