tag:crieit.net,2005:https://crieit.net/tags/OracleCloud/feed
「OracleCloud」の記事 - Crieit
Crieitでタグ「OracleCloud」に投稿された最近の記事
2019-11-11T10:57:24+09:00
https://crieit.net/tags/OracleCloud/feed
tag:crieit.net,2005:PublicArticle/15538
2019-11-11T10:57:24+09:00
2019-11-11T10:57:24+09:00
https://crieit.net/posts/Oracle-Django-Nginx-uWSGI
Oracle無料ティアでDjango+Nginx+uWSGIでサーバを立ててみる
<p>Oracle Cloudで常時無料サービスが開始されたので使ってみた。<br />
構成は、Django+nginx+uWSGI+Oracle Database+Oracle Linux</p>
<p>以下の3つの環境を作ってみたので、その時の備忘録。</p>
<ul>
<li>ローカルの開発環境</li>
<li>ローカルでDockerを使った開発環境</li>
<li>コンピュート・インスタンスでの本番環境</li>
</ul>
<p>とりあえず、Djangoの雛形アプリにアクセスできるまでの簡易なので、<br />
SSL対応などは省いてます。</p>
<h3 id="Oracle Cloudの常時無料サービス(無料ティア)について"><a href="#Oracle+Cloud%E3%81%AE%E5%B8%B8%E6%99%82%E7%84%A1%E6%96%99%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%28%E7%84%A1%E6%96%99%E3%83%86%E3%82%A3%E3%82%A2%29%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Oracle Cloudの常時無料サービス(無料ティア)について</a></h3>
<p>新しく常時無料で利用できるようになったサービスたち。<br />
・<a target="_blank" rel="nofollow noopener" href="https://www.oracle.com/jp/cloud/free/">Oracle Cloud無償ティア | オラクル | Oracle 日本</a></p>
<p>利用できるのは、以下のようなもの。</p>
<ul>
<li>データベース ... 20GBを2つまで</li>
<li>コンピュート ... 仮想マシン。1/8 OCPU・1GBを2つまで</li>
<li>ストレージ ... 合計100GBの2つのブロック・ボリューム。10GBのオブジェクト・ストレージ</li>
</ul>
<p>ほかにもロードバランサや監視・通知などある。</p>
<p>仮想マシンもデータベースも1アカウントにつき2つまでなので、<br />
1サービスであれば、ステージング環境と本番環境を用意できそう。</p>
<hr />
<h3 id="とりあえずDBを作ってみる"><a href="#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9ADB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">とりあえずDBを作ってみる</a></h3>
<p>トップ画面から。</p>
<p><img width="1367" alt="oracle_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/dde42040-2f99-5a2a-4824-5894bd4ce59d.png"></p>
<p>名前とAdminのパスワードを設定する。<br />
Always FreeもONにしておく。</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/ce050658-f517-7338-ef93-cd0d07893e16.png" alt="oracle_2.png" /></p>
<p>「Autonomous Databaseの作成」をクリックすると、プロビジョンがはじまる。<br />
プロビジョンが終わるとこんな感じに。</p>
<p><img width="1436" alt="スクリーンショット 2019-11-10 15.59.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/0df9b110-5004-76cd-f942-10780d1c1e39.png"></p>
<h5 id="WebブラウザでDBにアクセスしてみる"><a href="#Web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7DB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">WebブラウザでDBにアクセスしてみる</a></h5>
<p>SQL Developer Webからアクセスできる。</p>
<p>「DB接続」>「アプリケーション接続」>「SQL Developer Web」にある。<br />
「アクセスURL」をコピーして、ブラウザに貼り付け。</p>
<p><img width="742" alt="oracle_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/8795616a-9ab4-87a2-cc78-460e9680f30d.png"></p>
<p>ログイン画面が表示されるので、DBを作ったときのパスワードを入力。<br />
アカウントは「admin」</p>
<p><img width="490" alt="スクリーンショット 2019-11-10 16.00.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/003a489d-23f3-3f50-4cff-a49f674fe002.png"></p>
<p>ログインできるとこんな感じ</p>
<p><img width="843" alt="スクリーンショット 2019-11-10 16.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/485c6462-de41-ad35-6829-33292cce2129.png"></p>
<hr />
<h3 id="ローカルの開発環境を作ってみる"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">ローカルの開発環境を作ってみる</a></h3>
<p>とりあえず、開発用にローカル環境で<code>python manage.py runserver</code>できるようにする。<br />
ローカルの環境はmacOS Mojave(10.14.6)</p>
<h4 id="まずは、Djangoの雛形を作成する"><a href="#%E3%81%BE%E3%81%9A%E3%81%AF%E3%80%81Django%E3%81%AE%E9%9B%9B%E5%BD%A2%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">まずは、Djangoの雛形を作成する</a></h4>
<pre><code class="shell"># pythonのバージョンは3.7.3
$ python3 -V
Python 3.7.3
# ディレクトリの作成
$ mkdir sample
$ cd sample/
# 仮想環境の作成
$ python3 -m venv venv
$ source venv/bin/activate
# djangoのインストール
$ pip install --upgrade pip
$ pip install django
# djangoプロジェクトの作成
$ django-admin startproject myproject
$ cd myproject
$ python manage.py migrate
# 起動
$ python manage.py runserver
</code></pre>
<p>これでとりあえず、デフォルトのデータベース(SQLite)で立ち上がるとこまで完成。</p>
<p><img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/e2a487cd-a318-d09c-e9f3-899f598eee09.png" /></p>
<h4 id="ローカルでOracleDBを使えるようにする"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7OracleDB%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B">ローカルでOracleDBを使えるようにする</a></h4>
<h5 id="Oracle Instant Clientのインストール"><a href="#Oracle+Instant+Client%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Oracle Instant Clientのインストール</a></h5>
<p>OracleDBを使うためには、Oracle Instant Clientが必要なので、<br />
以下からダウンロードしてインストールする。<br />
・<a target="_blank" rel="nofollow noopener" href="https://www.oracle.com/database/technologies/instant-client/downloads.html">Oracle Instant Client Downloads</a></p>
<p>Macだったので、「<a target="_blank" rel="nofollow noopener" href="https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html">Instant Client for macOS (Intel x86)</a>」の「Basic Light Package」を選択</p>
<pre><code class="sh">## インストールするディレクトリを作成
$ sudo mkdir -p /opt/oracle
## インストールしたファイルを展開
$ sudo unzip ~/Downloads/instantclient-basiclite-macos.x64-19.3.0.0.0dbru.zip -d /opt/oracle
## ライブラリを参照できるように${HOME}/libにリンクを追加
$ mkdir ~/lib
$ ls -s /opt/oracle/instantclient_19_3/libclntsh.dylib ~/lib/
$ cp /opt/oracle/instantclient_19_3/lib* ~/lib/
</code></pre>
<h5 id="環境変数にインストールした場所を設定"><a href="#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E5%A0%B4%E6%89%80%E3%82%92%E8%A8%AD%E5%AE%9A">環境変数にインストールした場所を設定</a></h5>
<pre><code class="shell">echo "export ORACLE_HOME=/opt/oracle/instantclient_19_3" >> ~/.bashrc
source ~/.bashrc
</code></pre>
<h5 id="認証情報の配置"><a href="#%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E9%85%8D%E7%BD%AE">認証情報の配置</a></h5>
<p>Oracle Cloudの「Autonomous Database」>「Autonomous Databaseの詳細」にある<br />
「DB接続」からウォレットをダウンロードしてくる。</p>
<p><img width="753" alt="oracle_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/6b23b62d-623d-2fad-ea3b-a95c11d4d605.png"></p>
<p>ファイル名は「<code>Wallet_<データベース名>.zip</code>」。<br />
今回はデータベース名が<code>sample</code>なので、<code>Wallet_sample.zip</code>となる。</p>
<pre><code class="shell">## 認証ファイルを配置するディレクトリを作成
$ mkdir -p /opt/oracle/instantclient_19_3/network/admin
## ダウンロードしたウォレットを展開して配置
$ sudo unzip ~/Downloads/Wallet_sample.zip -d ${ORACLE_HOME}/network/admin
Archive: ~/Downloads/Wallet_sample.zip
inflating: /opt/oracle/instantclient_19_3/network/admin/cwallet.sso
inflating: /opt/oracle/instantclient_19_3/network/admin/tnsnames.ora
inflating: /opt/oracle/instantclient_19_3/network/admin/truststore.jks
inflating: /opt/oracle/instantclient_19_3/network/admin/ojdbc.properties
inflating: /opt/oracle/instantclient_19_3/network/admin/sqlnet.ora
inflating: /opt/oracle/instantclient_19_3/network/admin/ewallet.p12
inflating: /opt/oracle/instantclient_19_3/network/admin/keystore.jks
</code></pre>
<h5 id="cx_Oracle(pythonライブラリ)のインストール"><a href="#cx_Oracle%28python%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%29%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">cx_Oracle(pythonライブラリ)のインストール</a></h5>
<p>Oracle Databaseのpythonライブラリをインストールする</p>
<pre><code>$ pip install cx_Oracle
</code></pre>
<h5 id="settings.pyの設定"><a href="#settings.py%E3%81%AE%E8%A8%AD%E5%AE%9A">settings.pyの設定</a></h5>
<p>settings.pyをOracleように変更。<br />
<code>NAME</code>には、TNS名のどれかを指定する。</p>
<p><img width="753" alt="oracle_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/6b23b62d-623d-2fad-ea3b-a95c11d4d605.png"></p>
<p>今回は一番上の<code>sample_HIGH</code>を選択。</p>
<pre><code class="python">DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'sample_HIGH',
'USER': 'admin',
'PASSWORD': '<DB作成時に入力したパスワード>',
}
}
</code></pre>
<p>マイグレーションをもう一度実行してみて、接続できるか確認。</p>
<pre><code class="shell">$ python manage.py migrate
</code></pre>
<p>マイグレーションが成功すると、Webブラウザ上のSQL Developerでも確認できる。</p>
<p><img width="926" alt="スクリーンショット 2019-11-10 16.35.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/53393a83-0772-2f8e-9814-6d2ddbe203bd.png"></p>
<p>これで、とりあえず、開発できるようになった(<em>´ω`</em>)</p>
<hr />
<h3 id="ローカルでDockerを使った開発環境を作ってみる"><a href="#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7Docker%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">ローカルでDockerを使った開発環境を作ってみる</a></h3>
<p>実際にデプロイする際は、NginxとuWSGIを利用するので、<br />
それを試せる環境をDockerで構築する。</p>
<h4 id="Django側の変更"><a href="#Django%E5%81%B4%E3%81%AE%E5%A4%89%E6%9B%B4">Django側の変更</a></h4>
<p>nginx+uWSGIで動かすために、いくつか変更。</p>
<h5 id="1. STATIC_ROOTとALLOWED_HOSTS設定"><a href="#1.+STATIC_ROOT%E3%81%A8ALLOWED_HOSTS%E8%A8%AD%E5%AE%9A">1. STATIC_ROOTとALLOWED_HOSTS設定</a></h5>
<p>settings.pyを以下の感じに変更。<br />
ログファイルも出るように変更。</p>
<pre><code class="diff">-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ["127.0.0.1"]
...
STATIC_URL = '/static/'
+STATIC_ROOT = os.path.join(BASE_DIR, "static/")
+# for logging
+LOGGING = {
+ 'version': 1,
+ 'disable_existing_loggers': False,
+
+ 'formatters': {
+ 'standard': {
+ 'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
+ 'datefmt': "%d/%b/%Y %H:%M:%S"
+ },
+ },
+ 'handlers': {
+ 'file': {
+ 'level': 'INFO',
+ 'class': 'logging.handlers.RotatingFileHandler',
+ 'filename': 'django.log',
+ 'maxBytes': 50000,
+ 'backupCount': 2,
+ 'formatter': 'standard',
+ },
+ },
+ 'loggers': {
+ 'django': {
+ 'handlers': ['file'],
+ 'level': 'DEBUG',
+ 'propagate': True,
+ },
+ },
+}
</code></pre>
<h5 id="2. staticディレクトリを作成&配置"><a href="#2.+static%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%26amp%3B%E9%85%8D%E7%BD%AE">2. staticディレクトリを作成&配置</a></h5>
<p>manage.pyと同じ場所に作成し、<br />
django-adminのcssとかを配置</p>
<pre><code class="shell">$ mkdir static
$ python manage.py collectstatic
</code></pre>
<h4 id="Docker用の資材を配置"><a href="#Docker%E7%94%A8%E3%81%AE%E8%B3%87%E6%9D%90%E3%82%92%E9%85%8D%E7%BD%AE">Docker用の資材を配置</a></h4>
<pre><code class="shell"># Docker用の資材の配置場所を作成
$ mkdir docker
# 資格情報の配置
$ mkdir docker/wallet
$ unzip ~/Downloads/Wallet_sample.zip -d docker/wallet/
Archive: ~/Downloads/Wallet_sample.zip
inflating: wallet/cwallet.sso
inflating: wallet/tnsnames.ora
inflating: wallet/truststore.jks
inflating: wallet/ojdbc.properties
inflating: wallet/sqlnet.ora
inflating: wallet/ewallet.p12
inflating: wallet/keystore.jks
# NginxやuWSGIの設定ファイルは以下に配置
$ mkdir docker/conf
$ touch docker/conf/requirements.txt
$ touch docker/conf/myproject_nginx.conf
$ touch docker/conf/myproject_uwsgi.ini
$ touch docker/conf/uwsgi.service
# Dockerfireとdocker-compose.ymlを配置
$ touch docker/Dockerfile
$ touch docker-compose.yml
</code></pre>
<p>ディレクトリ的にはこんな感じ。</p>
<pre><code>.
├── docker/
│ ├── conf/
│ │ ├── myproject_nginx.conf
│ │ ├── myproject_uwsgi.ini
│ │ └── uwsgi.service
│ ├── wallet
│ │ ├── ...
│ │ └── tnsnames.ora
│ ├── Dockerfile
│ └── requirements.txt
├── myproject/
│ ├── myproject/
│ │ ├── settings.py
│ │ └── wsgi.py
│ ├── static/
│ └── manage.py
├── venv/
└── docker-compose.yml
</code></pre>
<p>各ファイルの中身は以下の感じ。</p>
<h5 id="docker-compose.yml"><a href="#docker-compose.yml">docker-compose.yml</a></h5>
<pre><code class="yml">version: '2'
services:
web:
build: "./docker"
volumes: # djangoアプリを/var/www配下にマウント
- ./myproject:/var/www/myproject
ports: # 80および8000ポートを開けておく
- "80:80"
- "8000:8000"
# systemctlを使うので特権を有効にしておく
privileged: true
command: /sbin/init
</code></pre>
<h5 id="docker/Dockerfile"><a href="#docker%2FDockerfile">docker/Dockerfile</a></h5>
<pre><code class="dockerfile"># Oracle Cloud Infrastructureでも
# OracleLinuxを使うのでoraclelinuxのイメージを使う
FROM oraclelinux:7
### ENV
ENV ORACLE_HOME "/usr/lib/oracle/18.3"
### INSTALL ORACLE DATABASE
# oracle-instantclientを利用するために、2つリポジトリを有効化
RUN yum install -y oracle-release-el7 oracle-softwarecollection-release-el7
RUN yum install -y oracle-instantclient18.3-basiclite
RUN echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf
RUN mkdir -p ${ORACLE_HOME}/network/admin
COPY wallet/* ${ORACLE_HOME}/network/admin/
### INSTALL PYTHON
# python3-develを利用するために、ol7_optional_latestを有効化
RUN yum-config-manager --enable ol7_optional_latest
RUN yum install -y python3 python3-devel gcc
### CREATE VIRTUAL ENV
RUN mkdir /var/www/
RUN mkdir /var/www/myproject
WORKDIR /var/www/
RUN python3 -m venv venv
# 作成した仮想環境(venv)にactivateする
ENV PATH="/var/www/venv/bin:$PATH"
COPY requirements.txt /var/www/
RUN pip install -r requirements.txt
#### INSTALL NGINX
RUN yum install -y nginx
COPY conf/myproject_nginx.conf /etc/nginx/conf.d/
RUN systemctl enable nginx
RUN chown -R nginx.nginx /var/www
RUN chmod 755 /var/www
### SETUP uWSGI Emperor mode
RUN mkdir /etc/uwsgi
RUN mkdir /etc/uwsgi/vassals
COPY conf/myproject_uwsgi.ini /etc/uwsgi/vassals
# uWSGIのログディレクトリを作成
RUN mkdir /var/log/uwsgi
RUN chown -R nginx:nginx /var/log/uwsgi
# uWSGIをサービスに登録
COPY conf/uwsgi.service /etc/systemd/system/
RUN systemctl enable uwsgi
</code></pre>
<h5 id="docker/conf/requirements.txt"><a href="#docker%2Fconf%2Frequirements.txt">docker/conf/requirements.txt</a></h5>
<pre><code class="txt">Django==2.2.7
cx-Oracle==7.2.3
uWSGI==2.0.18
</code></pre>
<h5 id="docker/conf/myproject_nginx.conf"><a href="#docker%2Fconf%2Fmyproject_nginx.conf">docker/conf/myproject_nginx.conf</a></h5>
<pre><code class="nginx"># the upstream component nginx needs to connect to
upstream django {
# myproject_uwsgi.iniで設定したsocketファイルを指定
# unix://<socketファイルのパス>
server unix:///var/www/myproject.sock;
}
# configuration of the server
server {
listen 80;
# IPアドレスを指定。ローカルなので、127.0.0.1を設定
server_name 127.0.0.1;
charset utf-8;
# Django static
location /static {
alias /var/www/myproject/static;
}
# Finally, send all non-media requests to the Django server.
location / {
include uwsgi_params;
uwsgi_pass django;
}
}
</code></pre>
<h5 id="docker/conf/myproject_uwsgi.ini"><a href="#docker%2Fconf%2Fmyproject_uwsgi.ini">docker/conf/myproject_uwsgi.ini</a></h5>
<pre><code class="ini">[uwsgi]
# Djangoプロジェクトのパスを指定
chdir = /var/www/myproject
# Djangoプロジェクトのwsgi.pyを指定
module = myproject.wsgi
# venvのパスを指定
home = /var/www/venv
# process-related settings: master
master = true
# maximum number of worker processes
processes = 10
# socketファイルののパス
socket = /var/www/myproject.sock
# socketファイルのユーザと権限を設定
chown-socket = nginx:nginx
chmod-socket = 666
# clear environment on exit
vacuum = true
# logfile
logto = /var/log/uwsgi/%n.log
</code></pre>
<h5 id="docker/conf/uwsgi.service"><a href="#docker%2Fconf%2Fuwsgi.service">docker/conf/uwsgi.service</a></h5>
<pre><code>[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
User=nginx
Group=nginx
# 環境変数の設定
Environment="ORACLE_HOME=/usr/lib/oracle/18.3"
Environment="LD_LIBRARY_PAT=${ORACLE_HOME}/client64/lib:$LD_LIBRARY_PATH"
Environment="PATH=$PATH:${ORACLE_HOME}/client64/lib"
# EmperorモードでuWSGIを実行。venvにあるuwsgiを使う
ExecStart=/var/www/venv/bin/uwsgi --master --emperor /etc/uwsgi/vassals --die-on-term --uid nginx --gid nginx --logto /var/log/uwsgi/emperor.log
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
</code></pre>
<h4 id="Dockerを起動"><a href="#Docker%E3%82%92%E8%B5%B7%E5%8B%95">Dockerを起動</a></h4>
<pre><code class="shell"># dockerを立ち上げ
$ docker-compose up -d
</code></pre>
<p>これでうまくビルドされて立ち上がれば、<br />
<code>http://127.0.0.1</code>にアクセスできる。</p>
<p><code>myproject_nginx.conf</code>の<code>server_name</code>で、<code>127.0.0.1</code>を指定しているので、<br />
<code>http://127.0.0.1</code>じゃないとDjangoアプリにアクセスできないので注意。</p>
<p><code>http://localhost</code>だと、<code>myproject_nginx.conf</code>の設定が適用されず、<br />
nginxのデフォルトページが表示される。</p>
<h5 id="よく使うログインとか停止とかはこんな感じ。"><a href="#%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%8B%E5%81%9C%E6%AD%A2%E3%81%A8%E3%81%8B%E3%81%AF%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98%E3%80%82">よく使うログインとか停止とかはこんな感じ。</a></h5>
<pre><code class="shell"># コンテナにログイン
$ docker-compose exec web /bin/bash
# 停止
$ docker-compose stop
# 削除
$ docker-compose rm
# Dockerfile ビルド
$ docker-compose build
# Dockerfile ビルド(キャッシュなし)
$ docker-compose build --no-cache
# コンテナをせんぶ削除
$ docker rm `docker ps -a -q`
</code></pre>
<h5 id="うまくいかないときにみるところ"><a href="#%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%BF%E3%82%8B%E3%81%A8%E3%81%93%E3%82%8D">うまくいかないときにみるところ</a></h5>
<p>以下の場所にログファイルが出力されるので見てみる。</p>
<ul>
<li><code>/var/log/messages</code> ... systemdのログ</li>
<li><code>/var/log/nginx/error.log</code> ... nginxのエラーログ</li>
<li><code>/var/log/uwsgi/emperor.log</code> ... uWSGI Emperorのログ</li>
<li><code>/var/log/uwsgi/myproject_uwsgi.log</code> ... myproject_uwsgi.iniのログ</li>
<li><code>/var/www/myproject/django.log</code> ... Djangoプロジェクトのログ</li>
</ul>
<p>あとは、「パスが正しいか」「権限、オーナーが正しいか」などを見てみるといいかも。</p>
<hr />
<h3 id="コンピュート・インスタンスで公開してみる"><a href="#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%88%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">コンピュート・インスタンスで公開してみる</a></h3>
<h4 id="仮想インスタンスの作成"><a href="#%E4%BB%AE%E6%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">仮想インスタンスの作成</a></h4>
<p>ここから選択。</p>
<p><img width="1367" alt="oracle_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/58f5c6f6-a84b-435e-eadf-96a795fe8ba8.png"></p>
<p>こんな感じで入力。<br />
「<strong>パブリックIPアドレスの割当</strong>」を選択しておく。</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/71e54b71-dad2-9b33-3120-73ef26aae734.png" alt="oracle_6.png" /></p>
<p>ちゃんと「パブリックIPアドレスの割当」を選択していると、<br />
ここにIPアドレスが表示される</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/2a714a85-2389-506d-4a8c-9197fb9ca208.png" alt="oracle_7.png" /></p>
<p>デフォルトのユーザは<code>opc</code>なので、<br />
こんな感じで、sshでログインできる。</p>
<pre><code class="shell">$ ssh opc@<IPアドレス>
</code></pre>
<h4 id="セキュリティルールを設定"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A">セキュリティルールを設定</a></h4>
<p>HTTP(ポート80)でアクセスできるようにセキュリティルールを設定する<br />
ただ、セキュリティルールを設定する場所は少しわかりにくい。。</p>
<p>仮想インスタンスの詳細にアクセスして、<br />
「仮想クラウド・ネットワーク」を選択</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/8c83e806-cb22-481f-a7c4-1903c7766685.png" alt="oracle_8.png" /></p>
<p>左下に「ネットワーク・セキュリティ・グループ」を選択。<br />
「ネットワーク・セキュリティ・グループの作成」を選択すると、追加できるようになる。</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/107254d4-5c9f-155d-5fb2-f9ba13c9d621.png" alt="oracle_9.png" /></p>
<p>「名前」と「コンパートメント」に作成を設定</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/4464efc9-a245-3858-707c-811f12a166d9.png" alt="oracle_10.png" /></p>
<p>ルールの追加を以下のように設定して、「作成」をクリック</p>
<p><img width="1404" alt="oracle_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/f604553d-7ea4-925d-944b-2410bd920e91.png"></p>
<p>これで作成できたので、仮想インスタンスの詳細にもどって、<br />
「ネットワーク・セキュリティ・グループ」の「編集」を選択</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/8c96405c-539f-9197-40b0-782c30b85079.png" alt="oracle_12.png" /></p>
<p>さっき作ったセキュリティグループを設定</p>
<p><img width="783" alt="スクリーンショット 2019-11-11 0.19.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/12823048-83d2-1278-68a6-dcd45dace136.png"></p>
<h4 id="環境構築"><a href="#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">環境構築</a></h4>
<p>Dockerfileでやったような感じで、<br />
Django+nginx+uWSGIな環境を構築してく。</p>
<p>DockerイメージのOracleLinuxとは違い、</p>
<ol>
<li>リポジトリが最初から有効化されている</li>
<li>SELinuxが有効化されている</li>
</ol>
<p>という感じなので、ちょっと変更が必要。</p>
<h5 id="資材を仮想インスタンスに送る"><a href="#%E8%B3%87%E6%9D%90%E3%82%92%E4%BB%AE%E6%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E9%80%81%E3%82%8B">資材を仮想インスタンスに送る</a></h5>
<p>Dockerのときに使った資材を仮想インスタンスに送る。</p>
<pre><code class="shell">$ scp -r docker opc@<IPアドレス>:~/
$ scp -r myproject/ opc@<IPアドレス>:~/
</code></pre>
<p>送信したら、ログインして確認。</p>
<pre><code class="shell">$ ssh opc@<IPアドレス>
$ pwd
/home/opc
$ ls
docker myproject
</code></pre>
<p>ログイン後のディレクトリ構成はこんな感じ</p>
<pre><code>/home/opc
├── docker/
│ ├── conf/
│ │ ├── myproject_nginx.conf
│ │ ├── myproject_uwsgi.ini
│ │ └── uwsgi.service
│ ├── wallet
│ │ ├── ...
│ │ └── tnsnames.ora
│ ├── Dockerfile
│ └── requirements.txt
├── myproject/
│ ├── myproject/
│ │ ├── settings.py
│ │ └── wsgi.py
│ ├── static/
│ └── manage.py
├── venv/
└── docker-compose.yml
</code></pre>
<h5 id="設定ファイルの変更"><a href="#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%9B%B4">設定ファイルの変更</a></h5>
<p>IPアドレスと<code>127.0.0.1</code>にしていたので変更する。</p>
<h6 id="~/docker/conf/myproject_nginx.conf"><a href="#%7E%2Fdocker%2Fconf%2Fmyproject_nginx.conf">~/docker/conf/myproject_nginx.conf</a></h6>
<pre><code class="diff"> server {
- server_name 127.0.0.1;
+ server_name <IPアドレス>;
}
</code></pre>
<h6 id="~/myproject/myproject/settings.py"><a href="#%7E%2Fmyproject%2Fmyproject%2Fsettings.py">~/myproject/myproject/settings.py</a></h6>
<pre><code class="diff">-ALLOWED_HOSTS = ["127.0.0.1"]
+ALLOWED_HOSTS = ["<IPアドレス>"]
</code></pre>
<h5 id="環境構築の実施"><a href="#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E5%AE%9F%E6%96%BD">環境構築の実施</a></h5>
<pre><code class="shell">$ sudo -s
### INSTALL ORACLE DATABASE
$ yum install -y oracle-instantclient18.3-basiclite
$ echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf
$ mkdir -p /usr/lib/oracle/18.3/network/admin
$ /home/opc/docker/wallet/* /usr/lib/oracle/18.3/network/admin/
### INSTALL PYTHON
$ yum install -y python3 python3-devel gcc
### CREATE VIRTUAL ENV
$ mkdir /var/www/
$ cp -r /home/opc/myproject /var/www
$ cd /var/www/
$ python3 -m venv venv
# 作成した仮想環境(venv)にactivateする
$ source venv/bin/activate
$ pip install -r /home/opc/docker/requirements.txt
#### INSTALL NGINX
$ yum install -y nginx
$ cp /home/opc/docker/conf/myproject_nginx.conf /etc/nginx/conf.d/
$ systemctl enable nginx
$ chown -R nginx.nginx /var/www
# $ chmod 755 /var/www
### SETUP uWSGI Emperor mode
$ mkdir -p /etc/uwsgi/vassals
$ cp /home/opc/docker/conf/myproject_uwsgi.ini /etc/uwsgi/vassals
# uWSGIのログディレクトリを作成
$ mkdir /var/log/uwsgi
$ chown -R nginx:nginx /var/log/uwsgi
# uWSGIをサービスに登録
$ cp /home/opc/docker/conf/uwsgi.service /etc/systemd/system/
$ systemctl enable uwsgi
##### ここから仮想インスタンス独自の設定
### Firewallの設定
# httpを追加する
$ firewall-cmd --permanent --add-service=http
# firewallを再起動して変更を反映
$ systemctl restart firewalld.service
### SELinuxの設定
$ restorecon -RF /var/www
### サービスの起動
$ systemctl restart nginx
$ systemctl restart uwsgi
</code></pre>
<p>一度、<code>http://<IPアドレス></code>にアクセスして確認してみる。<br />
エラーページが出ていたら、以下を実行</p>
<pre><code class="shell"># 監査ログを確認
$ cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx
# ポリシーファイルを作成
$ cat /var/log/audit/audit.log | audit2allow -M nginx
# ポリシーファイルを適用
$ semodule -i nginx.pp
</code></pre>
<p>これで、<code>http://<IPアドレス></code>にアクセスして、<br />
Djangoの画面が表示されて、django-adminの画面が操作できればOK</p>
<h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1>
<p>とりあえず、ローカルとインスタンス上の環境が作れたので、<br />
色々することはできそう(<em>´ω`</em>)</p>
<p>SSL対応、権限周りなど、本番としては足りないところがあるので、<br />
そのあたりは他の記事を参照ください〜ヽ(=´▽`=)ノ</p>
<h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2>
<p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br />
<a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p>
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p>
<p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p>
<p>要望・感想・アドバイスなどあれば、<br />
公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで♪</p>
<h1 id="参考にしたサイトさま"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88%E3%81%95%E3%81%BE">参考にしたサイトさま</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://docs.djangoproject.com/ja/2.2/ref/databases/#oracle-notes">データベース | Django ドキュメント | Django</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://oracle.github.io/python-cx_Oracle/">cx_Oracle - Python Interface for Oracle Database</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html">cx_Oracle 7 Installation — cx_Oracle 7.3.0-dev documentation</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html#ic_osx_inst">Instant Client for macOS (Intel x86)</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://oracle.github.io/odpi/doc/installation.html#macos">ODPI-C Installation — ODPI-C v3.2.2</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://shase428.hatenablog.jp/entry/2018/01/31/201543">Macでsqlplus使えるようにするメモ - ビットの海</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/oracle/python-cx_Oracle/issues/56">trouble running Oracle_cx on macOS · Issue #56 · oracle/python-cx_Oracle</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://docs.oracle.com/cd/E83857_01/iaas/compute-iaas-cloud/stcsg/accessing-oracle-linux-instance-using-ssh.html#GUID-D313B1A1-FB67-42C7-A7CC-958656A5207F">SSHを使用したOracle Linuxインスタンスへのアクセス</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://cloudii.atomitech.jp/entry/20190417/1555464532">コンピュート・インスタンスに予約済パブリックIPを付与する - Cloudii blog</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/chi9rin/items/af532d0dd9237cc65741#selinux-%E3%81%AE%E5%8B%95%E4%BD%9C%E3%83%A2%E3%83%BC%E3%83%89">SELinux を使おう.使ってくれ. - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://serverfault.com/questions/413397/how-to-set-environment-variable-in-systemd-service">arch linux - How to set environment variable in systemd service? - Server Fault</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/cof123/items/6c9d4b01f0057a9a8de0">EC2にnginx+uwsgi+python でHello World - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/takahirono7/items/fd6f9239f0f88eb65a7c">uwsgiのsystemd化(pyenv環境) - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yasunori/items/64606e63b36b396cf695#%E3%83%AD%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%83%88%E3%81%A7%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A6%8B%E5%A4%B1%E3%82%8F%E3%81%AA%E3%81%84">ちゃんと運用するときのuWSGI設定メモ - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.saintsouth.net/blog/setup-django-app-with-uwsgi-and-nginx/#toc-9">Nginx に uWSGI + Django アプリ を組み込む | SaintSouth.NET</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/5t111111/items/e170fead91261621b054#uwsgi-emperor">Ubuntu 12.04でpyenvを利用して速攻でPython3.4 + Nginx + uWSGI + FlaskなWebアプリケーション実行環境を作る - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.mathpython.com/ja/django-nginx-conf/">nginxでDjangoを使うときの設定ファイル:クライアント、nginx、uwsgiの流れを整理しよう - MathPython</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html">Setting up Django and your web server with uWSGI and nginx — uWSGI 2.0 documentation</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://pythonspeed.com/articles/activate-virtualenv-dockerfile/">Elegantly activating a virtualenv in a Dockerfile</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab">firewall-cmdコマンドの使い方 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yakumo/items/8ac195337414aabd39c0">Oracle Cloud で Compute にWebサーバーを立てたメモ - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e">venv: Python 仮想環境管理 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="http://blog.higty.xyz/archives/242/">SELinux + Nginx ポリシー設定 - URAGAMI</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.blog.umentu.work/centos7nginx-selinux%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E9%85%8D%E4%B8%8B%E3%81%AEweb%E3%82%B3%E3%83%B3%E3%83%86/">[CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可 | from umentu import stupid</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae#%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E7%A2%BA%E8%AA%8D">Dockerイメージとコンテナの削除方法 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/gold-kou/items/44860fbda1a34a001fc1#rm">いまさらDockerに入門したので分かりやすくまとめます - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/okhrn/items/d8580e66546d166f489a">Dockerネットワーク設定 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa">Docker Compose - docker-compose.yml リファレンス - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae">Dockerイメージとコンテナの削除方法 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/prgseek/items/e557a371d7bd1f57b9b1#-docker-composeyml">Docker Compose で複数コンテナ構築&管理 - Qiita</a></li>
</ul>
きらぷか@積読ハウマッチ/SSSAPIなど
tag:crieit.net,2005:PublicArticle/15481
2019-10-15T07:49:45+09:00
2019-10-15T12:20:21+09:00
https://crieit.net/posts/Oracle-Cloud-Laravel
Oracle CloudでLaravelを動かしてみた
<p>Oracle CloudではサーバーとRDBがAlways Freeにより永久無料で使えるという事なのでLaravelを動かせるか試してみました。Google Cloud Platformもサーバーの無料枠はありますが、RDBは今のところHeroku以外で自由なフレームワークから利用できるクラウドサービスは知りません。これでもしLaravelも無料で動かせるようになれば最高です。</p>
<p>ちなみにデータベースはOracleです。このあたりWeb系の人は慣れてない人が多いかもしれませんので注意です。僕もよく分からず試しました。</p>
<h2 id="注意点"><a href="#%E6%B3%A8%E6%84%8F%E7%82%B9">注意点</a></h2>
<p>クラウドサービスにありがちですが、サーバーは無料だけど、それを動かすための他の何かが有料、だったり、微妙な設定により有料になってしまう場合がある、等のようなこともありえます。</p>
<p>Oracle Cloudは登録したばかりだと1ヶ月間は期間限定で無料枠がついているため、本当にAlways Freeにより無料になっているのか、1ヶ月無料のせいで無料に見えてしまっているのかの判断ができません。</p>
<p>ということで当記事も無料でOracle Cloudを使ってみる、という趣旨ではなく、あくまでもタイトルそのままの通り、Oracle CloudでLaravelを動かしてみた、というだけの話となります。また1ヶ月経って色々明らかになったらまた更新します。</p>
<p>ちなみに、人によってはまだAlways Freeのインスタンスが作成できない、という声も上がっているようです。まだ供給不足の可能性がありますのでうまくいかない場合は日をおいて試してみる必要があるかもしれません。(2019年9月時点)</p>
<p>(ちなみに、メモらずにばーっと試してから書いているため抜けのある手順などももしかしたらあるかもしれません)</p>
<h2 id="Oracle Cloudに新規登録"><a href="#Oracle+Cloud%E3%81%AB%E6%96%B0%E8%A6%8F%E7%99%BB%E9%8C%B2">Oracle Cloudに新規登録</a></h2>
<p>ひとまずOracle Cloudに新規登録してアカウントを作成しておく必要があります。新規登録にはクレジットカードと電話番号の登録が必要です。</p>
<p>僕の場合、いつも使っているクレジットカードだとなぜかエラーになって登録できなかったため、別のカードを登録しました。念の為複数のカードを用意しておいて方が良いかもしれません。</p>
<h2 id="インスタンスを作成"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90">インスタンスを作成</a></h2>
<p>Oracle Cloudにログインできたら、早速インスタンスを作成します。具体的には恐らくOracle Cloud Infrastructureという枠のCompute Cloud Serviceというサービスになると思います。コンソールのメニューでいうとこの画像のように、「コンピュート」→「インスタンス」でアクセスできるページです。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da31c49440b7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da31c49440b7.png?mw=700" alt="" /></a></p>
<p>ここにインスタンスの作成ボタンがありますのでそちらをクリックしてインスタンスを作成していきます。いまのところ、作成画面はすごくシンプルのようです。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da31d1c96187.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da31d1c96187.png?mw=700" alt="" /></a></p>
<p>命名はそのままでも適当に変更するでも良いでしょう。</p>
<h3 id="イメージの選択"><a href="#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E9%81%B8%E6%8A%9E">イメージの選択</a></h3>
<p>イメージ・ソースの変更ボタンをクリックすると、OSのイメージを変更することができます。下記のように、Always Free対象が書かれているので分かりやすいです。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da31d82868f7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da31d82868f7.png?mw=700" alt="" /></a></p>
<p>ここから好きなものを選択しましょう。僕はせっかくなのでデフォルトのOracle Linuxの最新版である7.7を選択してみました。</p>
<p>僕はこれで適当にインスタンスを作成してしまったのですが、今「シェイプ、ネットワーク、ストレージ・オプション」の設定を開いて見てみたところ便利なものがあったので、一応紹介しておきます。</p>
<h3 id="パブリックIPアドレス"><a href="#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AFIP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9">パブリックIPアドレス</a></h3>
<p>何も設定せずインスタンスを作成してしまうと、パブリックIPアドレスが割り当てられません。そうすると当然ブラウザからアクセスすることができません。それどころかSSHで接続もできません(できるのかもしれませんが分からなかった&それっぽいものがあったけど無理だった)。そのためあとでIPを作成して割り当てる必要があるのですが、このオプションを見ると「パブリックIPアドレスの割当て」という設定があるようです。恐らくこちらを選択しておくと作成しておいてくれるので後で設定する必要がなくなって便利なのではないかと思います。</p>
<p>ちょっと忘れつつありますが、もしあとで設定する場合はインスタンス作成後、グローバルメニューに「ネットワーキング」→「パブリックIP」というメニューがあるため、そこで追加できたような気がします。</p>
<h3 id="SSHキーの追加"><a href="#SSH%E3%82%AD%E3%83%BC%E3%81%AE%E8%BF%BD%E5%8A%A0">SSHキーの追加</a></h3>
<p>SSHキーの追加のメニューもありました。SSH接続のために必要で、これもあとで設定できるので必ずしもここで設定する必要はないのですが、まあ、もう自分のPCに鍵があるのであれば指定しておくと良いと思います。公開鍵を指定してください。間違えて秘密鍵を指定しないようにしてください。</p>
<h3 id="作成実行"><a href="#%E4%BD%9C%E6%88%90%E5%AE%9F%E8%A1%8C">作成実行</a></h3>
<p>他もざっと見てみましたが、とりあえずはこれくらいで、他はデフォルトで大丈夫なのではないかと思います。問題なければ「作成」ボタンをクリックして作成してしまいましょう。</p>
<h2 id="インスタンスにSSH接続"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%ABSSH%E6%8E%A5%E7%B6%9A">インスタンスにSSH接続</a></h2>
<p>なにはともあれ作成したインスタンスにSSHでアクセスする必要があります。</p>
<p>インスタンス詳細画面の左メニューに「コンソール接続」というメニューがあります。これは作成したのかどうか覚えてないのですが、一つコンソール接続があります。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da3221a3a48c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da3221a3a48c.png?mw=700" alt="" /></a></p>
<p>ここのメニューでSSHもしくはVNCで接続する方法が説明されているようですが、僕の場合試してみてもうまくいかず、よく分かりませんでした。</p>
<p>ということで、普通にシェルでSSH接続を試してみたらできました。デフォルトでopcというユーザーが作られており、これでsudo出来るらしいです。</p>
<pre><code class="bash">ssh opc@パブリックIPアドレス
</code></pre>
<h2 id="インスタンス内で色々設定"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E5%86%85%E3%81%A7%E8%89%B2%E3%80%85%E8%A8%AD%E5%AE%9A">インスタンス内で色々設定</a></h2>
<p>とにかくLaravelを動かせるように色々設定していきます。Oracle LinuxはAmazon Linuxと同様、Red Hatベースのようですのでyumを使って色々とインストールしていきます。</p>
<p>今回、ちょうどいいシンプルなプロジェクトがなかった且つどれがOracle Linux内ですぐ動かせるのかよく分かっていなかったので、直接中でLaravelをインストールして動かしてみることにしました。既存のプロジェクトを動かしてみたい場合はGit等もインストールしておいてください。</p>
<h3 id="Apacheをインストール"><a href="#Apache%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Apacheをインストール</a></h3>
<p>とにかくApacheだとたいして設定しなくてもPHPをすぐ動かせるのでApacheをインストールしました。</p>
<pre><code>sudo yum install httpd
sudo systemctl enable httpd
sudo systemctl restart httpd
</code></pre>
<h3 id="Firewallの設定"><a href="#Firewall%E3%81%AE%E8%A8%AD%E5%AE%9A">Firewallの設定</a></h3>
<p>このままだとポートが開いておらず、Webサーバーにアクセスできません。とりあえず80番ポートを開きます。</p>
<p>ポートを確認</p>
<pre><code class="sh">sudo firewall-cmd --list-ports
</code></pre>
<p>ポートの設定を追加</p>
<pre><code class="sh">sudo firewall-cmd --permanent --add-port=80/tcp
</code></pre>
<p>追加した設定を反映&再度確認</p>
<pre><code class="sh">sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
</code></pre>
<p>これでサーバー内のポート設定はできました。しかしまだアクセスできないと思います。あとはコンソールのネットワークの設定も同様に必要っぽいです。</p>
<h3 id="コンソールでポートの設定"><a href="#%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A">コンソールでポートの設定</a></h3>
<p>これもちょっとうろ覚えなのですが、インスタンス詳細画面に「プライマリVNIC情報」という項目があり、そこに「パブリック・サブネット」というリンクがあると思います。それをクリックします。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da327a73d237.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da327a73d237.png?mw=700" alt="" /></a></p>
<p>すると下の方にサブネットの一覧が表示されます。「パブリック・サブネット」という名前のものが最初からあると思いますので、それをクリックします。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da327ea5edc0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da327ea5edc0.png?mw=700" alt="" /></a></p>
<p>するとセキュリティリストというものの一覧が出てきます。それの名前をクリックします。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da328336da52.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da328336da52.png?mw=700" alt="" /></a></p>
<p>ここでようやく「イングレス・ルール」というものが出てきます。最初からSSHの22ポートの設定があるためそれっぽい感じです。雰囲気で下記のような感じで追加でhttpとhttpsのポートを設定しました。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da32909d83fc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da32909d83fc.png?mw=700" alt="" /></a></p>
<p>これでIP直のURLでアクセスできるようになっていると思うので一応試しておくと良いと思います。問題なければApacheの最初のページが表示されます。</p>
<h3 id="PHPをインストール"><a href="#PHP%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">PHPをインストール</a></h3>
<p>こんな操作ログが残っていました。yum-config-managerなんて昔からありましたっけ? むちゃくちゃ便利ですね。というか、もしかしたらyum-utilsは最初から入っていたかもしれませんので、そうであれば最初の3行は不要かもです。</p>
<pre><code class="sh">sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum install yum-utils
sudo yum-config-manager --enable remi-php73
sudo yum install php php-mcrypt php-cli php-gd php-curl php-zip php-mbstring php-xml php-oci8
sudo systemctl restart httpd
</code></pre>
<p>php-oci8というものをインストールしていますが、これがOracleと接続するためのパッケージです。</p>
<h3 id="libclntsh.soをインストール"><a href="#libclntsh.so%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">libclntsh.soをインストール</a></h3>
<p>このままだと、<code>/usr/lib64/php/modules/oci8: cannot open shared object file</code>という、<code>libclntsh.so.19.1</code>というファイルが足りないぞ、というエラーがでてLaravelが動作しません。というか、PHPコマンド実行時に毎回Warningが出ます。<code>php-oci8</code>というPHPとOracleのInstant Clientを接続するパッケージはインストールされていますが、Instant Clientがインストールされていないためそのあたりのライブラリも入っていないようです。これをインストールします。</p>
<p>下記のページからrpmをダウンロードできます。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html">Instant Client for Linux x86-64 (64-bit)</a></p>
<p>一番最新のBasic Packageをダウンロードしてインストールしました。</p>
<pre><code class="sh">wget https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
sudo yum install oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
</code></pre>
<p>不安な場合は、zipファイルの方をダウンロードして中身を確認し、必要なlibclntsh.soが入っているかを確認してみると良いと思います。</p>
<p>もしかしたらApacheとPHPのあとにこれをインストールした場合はhttpdの再起動も必要かもしれません。</p>
<h3 id="Composerをインストール"><a href="#Composer%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Composerをインストール</a></h3>
<p>Composerもインストールしておきます。</p>
<pre><code class="sh">sudo su -
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
</code></pre>
<p>上記の場合スーパーユーザーでインストールしているので、完了したらexit等で元のユーザーに戻っておいてください。</p>
<h3 id="Laravelをインストール"><a href="#Laravel%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Laravelをインストール</a></h3>
<p>とりあえず素のLaravelを動かします。ドキュメントどおりにLaravelをインストールします。今回は<code>/var/www/app</code>としてインストールします。<code>/var/www</code>にcdしておきます。ディレクトリの権限とかはうまいこと設定しておいてください。</p>
<pre><code class="sh">composer create-project --prefer-dist laravel/laravel app
</code></pre>
<p>あとstorageディレクトリに書き込み権限が付いていない場合はつけておきます。</p>
<pre><code>chmod 0777 storage/
find storage -type d -exec chmod 0777 {} \;
find storage -type f -exec chmod 0666 {} \;
</code></pre>
<p>キーを作成しておきます。</p>
<pre><code>php artisan key:generate
</code></pre>
<p>まずはこれの最初のページが表示されることを目標に進めていきます。</p>
<h4 id="Apacheの設定"><a href="#Apache%E3%81%AE%E8%A8%AD%E5%AE%9A">Apacheの設定</a></h4>
<p>Laravelをインストールしたディレクトリ用のバーチャルホストの設定を行います。<code>/etc/httpd/conf.d/app.conf</code>というファイルを作成して書き込みます。ServerNameは適宜自分のものに合わせておいてください。</p>
<pre><code class="xml"><VirtualHost *:80>
DocumentRoot /var/www/app/public
ServerName octest.alphabrend.net
</VirtualHost>
<Directory "/var/www/app/public">
AllowOverride All
Options FollowSymLinks
</Directory>
</code></pre>
<p>設定できたらhttpdを再起動しておきます。</p>
<pre><code>sudo systemctl restart httpd
</code></pre>
<h4 id="SELinux"><a href="#SELinux">SELinux</a></h4>
<p>SELinuxが動作しているためうまく動きません。適切な設定が必要ですが、今回は試しのため無効にしてあります。</p>
<pre><code>sudo setenforce 0
</code></pre>
<h4 id="アクセスしてみる"><a href="#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">アクセスしてみる</a></h4>
<p>これで恐らくLaravelの最初のページにはアクセスできるようになっているのではないかと思います。<code>http://バーチャルホストで設定したホスト名</code>でアクセスしてみてください。</p>
<p>ディレクトリの所有権のエラーが出る場合にはもしかしたらstorageディレクトリの所有者をapacheにしておく必要があるかもしれません。</p>
<pre><code>sudo chown -R apache:apache storage
</code></pre>
<p>あとはおかしいな、と思ったらとりあえずhttpdを再起動してみると良いかもしれません。</p>
<h2 id="Oracleデータベースを利用する"><a href="#Oracle%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B">Oracleデータベースを利用する</a></h2>
<p>さて、ここまでは単なるインスタンスの設定だったのである意味どうでもよい話でしたが、引き続き肝となるOracleのデータベースへの接続を行ってLaravelが動作するようにしていきます。</p>
<p>今回利用するのはOracle Autonomous Transaction Processingというデータベースで、略してATPと呼ばれているようです。コンソールのメニューにもありますのでそちらを開きます。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da3359a49212.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da3359a49212.png?mw=700" alt="" /></a></p>
<h3 id="データベースを作成する"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">データベースを作成する</a></h3>
<p>「Autonomous Databaseの作成」ボタンをクリックして作成画面を開きます。</p>
<p>すこしスクロールすると、「Always Freeの構成オプションのみを表示」という設定があります。Always Freeで試したい場合はこちらを有効にしておくと良いでしょう。必要な設定は自動的に切り替わります。途中で有料の設定を選択してしまった場合はこちらも勝手に解除されるので確認にもなります。</p>
<p>「管理者資格証明の作成」というところでパスワードを設定します。admin(小文字)とこのパスワードでデータベースに接続できますので覚えておいてください。</p>
<p>基本的には他の設定は全部そのままで大丈夫だったと思います。問題なければ一番下の「Autonomous Databaseの作成」ボタンをクリックしてデータベースを作成します。</p>
<p>ちなみに、Always Freeの場合は一度も接続していない場合、ちょっと時間がたつとデータベースは停止してしまいます。接続したことがあっても、1週間くらいアクセスがなければ停止するようです。初期設定時はよく止まっていますので、止まっていたら適宜起動してください。</p>
<h3 id="クライアント資格証明"><a href="#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E8%B3%87%E6%A0%BC%E8%A8%BC%E6%98%8E">クライアント資格証明</a></h3>
<p>データベースの詳細画面を開くと、「DB接続」というボタンが表示されているためこれをクリックします。すると「クライアント資格証明(ウォレット)のダウンロード」という項目がありますので、このダウンロードボタンをクリックしてダウンロードしておきます。これを利用してデータベースに接続するようです。</p>
<p>そのためこれをサーバーに設置します。何か方法があるのかもしれませんが、よく分からなかったためとりあえず自分のPC上でscpを使って送信しました。</p>
<pre><code>scp ダウンロードしたファイル opc@パブリックIP:~
</code></pre>
<p>本来であればこれらのファイルを<code>/usr/lib/oracle/19.3/client64/lib/network/admin</code>に配置するらしいのですが、Laravelからは権限の問題でアクセスができませんでした。そのため、とりあえず<code>/php_oracle</code>というディレクトリを作り、ここに配置しました。</p>
<p>ちなみに必要なファイルは下記ですのでコピーしておいてください。</p>
<ul>
<li>tnsnames.ora</li>
<li>sqlnet.ora</li>
<li>cwallet.sso</li>
<li>ewallet.p12</li>
</ul>
<p>アクセスできる権限を与えておきます。</p>
<pre><code>sudo chown -R apache:apache /php_oracle
</code></pre>
<p>Laravel側でも環境変数でこのディレクトリの位置を指定できますのであとで説明します。</p>
<p>というかどうも全体的に所有者による権限の問題が頻発してました。詳しくは忘れたのか知らないのか分かりませんでしたが、改めて調査する時間をとるのが面倒だったのでとりあえず対処療法ばかりでやっています。すぐわかる方は適切な方法で対処してください。</p>
<h3 id="Laravelでの接続設定"><a href="#Laravel%E3%81%A7%E3%81%AE%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A">Laravelでの接続設定</a></h3>
<p>LaravelからOracleへの接続ですが、Laravelでは標準での接続方法が提供されていません。そのためパッケージをインストールする必要があります。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/yajra/laravel-oci8">yajra/laravel-oci8: Oracle DB driver for Laravel 4|5|6 via OCI8</a></p>
<p>これを利用することでMySQL等と同様に接続して利用できるようになります。Composerでインストールします。</p>
<pre><code>composer require yajra/laravel-oci8
</code></pre>
<p>そして設定用のファイルを生成します。</p>
<pre><code>php artisan vendor:publish --tag=oracle
</code></pre>
<p>このファイルの内容は環境変数から指定できるようになっているため、直接変更はせず.envで設定します。</p>
<p>注意点として、APP_ENVはproduction、APP_DEBUGはfalseにしておきましょう。IPがパブリックなため、デバッグ状態のままエラーが発生すると環境変数が丸見えになってしまい危険です。</p>
<p>データベースの部分は下記のような感じです。ただ、そもそもクライアント資格証明で接続すると思うので、DB_HOST~DB_PASSWORDは設定不要のものもあるかもしれません。適宜試してみてください。</p>
<pre><code class="ini">DB_CONNECTION=oracle
DB_TNS=DB201910021336_MEDIUM
DB_HOST=adb.ap-tokyo-1.oraclecloud.com
DB_PORT=1522
DB_DATABASE=DB201910021336
DB_USERNAME=admin
DB_PASSWORD=設定したパスワード
DB_SERVER_VERSION=18c
TNS_ADMIN=/php_oracle
</code></pre>
<p><code>DB_TNS</code>は、OracleコンソールのDB接続ボタンを押した時に表示される「TNS名」という部分です。5つあってよく分からなかったので適当にMEDIUMを選びました。</p>
<p><code>DB_HOST</code>と<code>DB_PORT</code>はTNS名の右に表示されている接続文字列という部分から適当に抽出しました。</p>
<p><code>DB_DATABASE</code>は作成したデータベースの名前です。<code>DB_USERNAME</code>はadmin(小文字)固定、<code>DB_PASSWORD</code>はデータベースを作成した時に設定したものです。</p>
<p><code>TNS_ADMIN</code>は先程クライアント資格証明を設定したフォルダを指定します。</p>
<h3 id="マイグレーションしてみる"><a href="#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">マイグレーションしてみる</a></h3>
<p>さて、実際にマイグレーションしてみましょう。</p>
<pre><code class="sh">php artisan migrate
</code></pre>
<p>問題なければいつものようにマイグレーションが実行されるはずです。</p>
<p>storageディレクトリの権限がどうのこうのというエラーになる場合は所有者を変更したりしてみてください。</p>
<pre><code>sudo chown -R opc:opc storage
</code></pre>
<p>Webでアクセスする場合にはまたapacheに戻しておいてください。</p>
<h3 id="ブラウザでアクセスしてみる"><a href="#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">ブラウザでアクセスしてみる</a></h3>
<p>次にブラウザでアクセスしてみますが、せっかくですのでDBから取得した情報も表示するようにします。<code>routes/web.php</code>のウェルカムページにユーザー取得処理を追加しておきます。実際には取得前に追加する処理も入れておくとよいでしょう。</p>
<pre><code class="php">Route::get('/', function () {
$users = \App\User::get();
return view('welcome', compact('users'));
});
</code></pre>
<p>そしてwelcome.blade.phpにも下記の表示を追加します。</p>
<pre><code class="html"> <div>
@foreach ($users as $user)
<div>Name: <span>{</span><span>{</span> $user->name <span>}</span><span>}</span></div>
@endforeach
</div>
</code></pre>
<p>問題なければこのような感じでデータが表示されます。</p>
<p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da3432430410.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5da3432430410.png?mw=700" alt="" /></a></p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>ということでOracle CloudでLaravelをDB込で動かすところまでをざっと雑に試してみました。サーバーの知識が必要なためちょっと難易度は高いかもしれませんが、これが永久無料だとするとかなり最高ですね。GCEの永久無料枠よりもスペックは高いですし、そもそも2台まで使えるというのがすごいです。</p>
<p>まだ良くわかっていないことも多いため気分が乗ったらまた色々試してみたいと思います。</p>
だら@Crieit開発者