初心者向け:webサーバーを作りアクセスしてみる
centos7にnginxだけを試しに導入してみる。
centos7をvirtualboxにインストール。
コマンド
$ yum update
$ yum search nginx
nginxがない問題が発生。
その場合は以下を入力。
$ sudo vi /etc/yum.repos.d/nginx.repo
ーーーーー内容ーーーーーーーーーーーーーーーーーーーーーーーーーー
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
$ yum install nginx
$ nginx -v
$ systemctl status nginx
$ systemctl start nginx
これでウェブサーバが完成した。これでウェブサーバにアクセスする準備が整った。
アクセス先を確認
$ ip a
ここで表示されたipをブラウザに入力してみると、 サイトにアクセスできない。
サーバーは起動しているのでその他の要素でアクセスできない。
$ systemctl status firewalld
$ systemctl stop firewalld
$ getenforce
$ setenforce 0
これで再びアクセス先にブラウザを通じて入力する。するとnginxのインストール成功と適切に起動しているというページが表示される。これでオッケイ!
あとは自分の作ったプログラムをnginxにつなげる接着面の設定をしてやれば良い。
ここについてはまた次回分かったら記述する。
プログラムの勉強方法について
どうすれば上達するのかについて今思うことを書くとすれば、
それは絶えず情報を頭に入れる。これしかない。
しかしながらいろんな記事を読むとプログラミングで遊んだり、いろいろな作品を作ると良いと書いてある事が多い。それはある程度情報を頭に入れたあとに行う段階のことを言っていると思う。
そもそもプログラミングは技術である。
そして人工物と自然物という属性があるとして、どちらが近いかと言ったら人工物よりの技術である。親が子に見せながら魚をさばいたり、絵の書き方と違って、人工成分が多いのだ。
ということは、代々技術を発展させた人々の思想、考えをトレースすることが技術の理解につながる。
ということは試行錯誤はほとんど不要。
特に新参者は自分のレベルを標準レベルに導くために動画やら本から情報を入れれば効率が良い。
上記はプログラムをいかにして学ぶか?という側面から考えた。
もう一つ重要な側面があると思っている。それはプログラムを書く際に絶対必要な知識となくても動くプログラムをかけてしまう知識を分けることだと思う。後者の知識はあっても損はないが、前者が欠落していると致命的である。これを分けるための方法論を私は知らないし、どれだけの知識量が必要なのかもわからない。ただインプットすべき知識には優先順位があると思って学習する態度が必要かもしれない。
あとはインプットする際にすべてをを理解しようと思わない。絶対力不足が理由で理解できないことがある。だからすべてを理解しようとしないで分かる範囲を広げてくイメージで勉強していく。
Git push先の変更のやり方
sourcetreeが使えない(プッシュできない)ので、gitからbitbucketにプッシュすることにした。ただこのときに色々いじっていたので、git自体も変な設定になっていた。
今回は
$ git push -u origin master
とやったところ、予期もしないリポジトリにプッシュすることになっていた。
(本当はHelloBitbucketにプッシュしたいところ、test5というリモートリポジトリだった。
今回得られた情報を整理したい。
まずプッシュ先の確認をどのように確認するか?
$ git remote -v
これで確認できる。表示されるのはhttpsでプッシュする場合とsshでプッシュする場合の2通りあり、さらにfetchの場合も表示される。つまり合計4つのパターンが表示される。
ここで自分が送信したいリモートリポジトリか確認すること。もし送信先が誤りの場合、いかの方法で送信先を変更することができる。ちなみに、
$ git remote -V をするとヘルプの表示になる。
送信先の変更(https)
$ git remote set-url origin <url>
これで送信先を変更することができる。
またbitbucketのリポジトリurlは以下のように構成されている。
https://
※ユーザ名とアカウント名は同じと考えて良いと思われるので神経質にならないでオッケイ!ソース:https://ja.confluence.atlassian.com/bitbucket/update-your-username-226165171.html のビックリマーク参照
また実際にこーどを打ち込む際に"https://....."とクォーテーションマークでくくってあげないとうまくコードが読み込まれなかった。
コードを打ち込んだら
$ git remote -v で確認したり、
再び
$ git push origin master
でプッシュしてみると、送信したい先にプッシュできるようになっています。
gitメモ
gitはできるだけやらないように避けてきたけど、sourcetreeがどうしても使えないのでやらざるを得ない。
問題はbitbucketに繋げないことが最大の問題だが。。。
メモしておく。
$ git checkout (branch-name)
これは今編集しているブランチところから入力先のブランチに移動するときに使用する。
$ git branch
これは今自分がどのブランチで編集を進めているか確認するために使う。
$ git add (file-name)
これは今いるブランチにファイルを追加したいときに使う。
$ git commit -m 'this is a pen'
これは編集内容を記憶して更にメッセージを付け加えておくコマンドである。
$ git log
コミットの履歴を見る。
使い方の流れ:
レポジトリ作りたいところにディレクトリ作成。$ mkdir xx
git のレポジトリを作成する。$ git branch master
そのレポジトリを初期化する。$ git init
レポジトリ内にファイルを作成する。ex. $ touch index.html
レポジトリに反映させる?これから変更した内容を追跡させるように登録する。
$ git add (file-name)
変更した内容を記録する $ git commit -m "this is a pen"
django リダイレクトについて
URL dispatcher — Django 1.4.6 documentation
クラスベースビューには、データ表示系のもの(ListViewやDetailView)とデータベース編集系のもの(CreateView,Updateview,DeleteView)がある。
データベース編集系には一種の特徴がある。フォームにデータ入力し送信すると、別のページに飛ばすことが一連の流れとして組み込まれている。詳しくは下記に補足1として後述する。
そういうわけでこちらが飛ばす先のページを予め設定していないとエラーになってしまう。
エラー:リダイレクト先を設定してねって。
このリダイレクト先を設定する方法について少しわかったのでまとめておく。
リダイレクト先を決める機能はsuccess_url である。
使い方は簡単でsuccess_url=reverse_lazy('urls.pyで定めたビューネーム')と設定すれば良い。詳しく知りたい場合は補足2参照。
ただしurlが動的な場合には、話が違ってくる。
なぜならこの方法が通用しないから。
reverse_lazyの引数にビューネームに加え、遷移したい数字等も必要になるのだ。
要は、success_url=reverse_lazy("ビューネーム",4)みたいなことがしたいわけだ。
でこの4は状況にによっては5や6にしたいってわけ。
get_success_url(self)を使うと、urls.pyの urlが取得できると思われる。
pathの第一引数のこと。
def get_url_success(self):
return reverse_lazy("urls.pyのname",kwargs={"pk":self.kwargs["pk"]} )
(補足1)edit系のクラスベースビューにリダイレクトが組み込まれている件について
edit系(CreateView,Updateview,DeleteView)にはそれぞれsuccess_url (※デフォルトでNone設定)属性をもつ。継承時には、この属性を定めてあげないとリダイレクト先に飛べずにエラーとなってしまう。例としてCreateViewを見てみる。
CreateViewはBaseCreateViewのpostメソッドを読み込む。このpostメソッドはProcessFormViewのpostメソッドを読み込む(つながる)。そしてform_validメソッドを読み込むことになる。
class BaseCreateView(ModelFormMixin, ProcessFormView): ...省略... def post(self, request, *args, **kwargs): self.object = None return super().post(request, *args, **kwargs)
https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L160
class ProcessFormView(View): ...省略... def post(self, request, *args, **kwargs): """ Handle POST requests: instantiate a form instance with the passed POST variables and then check if it's valid. """ form = self.get_form() if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form)
https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L129
form_validメソッドはまずModelFormMixinのほうを読み込む。ここでフォームに入力されたデータが新たに作られる。作られたのちFormMixinのform_validメソッドを読み込む。読み込んだ先はHttpResponseインスタンスの生成につながる。この引数にget_success_url()メソッドがあり、ここでsuccess_urlが必要になる。
class ModelFormMixin(FormMixin, SingleObjectMixin): ...省略... def form_valid(self, form): """If the form is valid, save the associated model.""" self.object = form.save() return super().form_valid(form)
https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L123
class FormMixin(ContextMixin): ...省略... def form_valid(self, form): """If the form is valid, redirect to the supplied URL.""" return HttpResponseRedirect(self.get_success_url())
https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L55
get_success_url()メソッドはModelFormMixinを読み込む。ここでCreateViewの継承したクラスにsuccess_urlを設定していないと、get_absolute_urlを取得しようとする。それでもできなかったものは"No URL to redirect to. Either provide a url or define"" a get_absolute_url method on the Model."というエラーを吐き出すことになる。
class ModelFormMixin(FormMixin, SingleObjectMixin): ...省略... def get_success_url(self): """Return the URL to redirect to after processing a valid form.""" if self.success_url: url = self.success_url.format(**self.object.__dict__) else: try: url = self.object.get_absolute_url() except AttributeError: raise ImproperlyConfigured( "No URL to redirect to. Either provide a url or define" " a get_absolute_url method on the Model.") return url
https://github.com/django/django/blob/2.1/django/views/generic/edit.py#L110
(補足2)success_url=reverse_lazy('urls.pyで定めたビューネーム')の使い方について
reverse_lazyとreverseの使い方は以下のように使う。
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
https://docs.djangoproject.com/ja/2.2/ref/urlresolvers/#django.urls.reverse
reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
https://docs.djangoproject.com/ja/2.2/ref/urlresolvers/#django.urls.reverse_lazy
要するにどちらもviewnameを記述すればよい。viewnameはurlconf(urls.py)で記述したname="hoge"のhogeを書くか、views.function_nameみたいな形でも良い。
今回の記事でなぜreverse_lazyを使ったのかについては以下の根拠がある。
Some common cases where this function is necessary are: providing a reversed URL as the url attribute of a generic class-based view. providing a reversed URL to a decorator (such as the login_url argument for the django.contrib.auth.decorators.permission_required() decorator). providing a reversed URL as a default value for a parameter in a function's signature.
generic class-based viewのurlアトリビュートとしてURLをreverseで使いたいときにはreverse_lazyが必要になる、ということだそうだ。今回はedit系のViewのurl(success_url)属性を定めるのでreverse_lazy()を採用する。
UpdateView 使い方メモ
前回CreateViewについてどう使うのか記したが、全く同じと考えて良い。
DHCPのこと
あまり良くわからなかったけど、なんかうまくまとめてあったのでメモしとく。
DHCPは例えばパソコンを立ち上げるだけで勝手にIPアドレスを各デバイス(ノード、エンドポイント)に割り当てることができる。
ちなみにDynamic Host Configuration protocolの略。
そしてネットワークに存在しているノードはすべてIPが割り振られているという事実も知っておくこと。
今疑問に思うことは、DHCPでIPを割り当てられてるならmac起動時もIPがかわるのではないか?macのIPに基づいてvirtualboxのCentOSサーバのIPを設定してるんだけどこれだと毎回設定しないといけないんじゃ??
デーモンってなに
デーモンはUNIX系OSで特定の機能を提供するプログラム。windowsでは同じようなものをサービスという。コンピュータやOS起ち上げ時に自動的に実行される。
末尾にdがついているものがデーモンのファイル判断する材料になる。
デーモンの種類
主に多くのプログラムが共通して必要とするシステム関連の処理をになうもの
systemd,syslogd
ハードウエア制御に関連するもの、通信ネットワークを通じて外部の相手から届く要求を処理するもの
inetd,tcpd,httpd,ftpd,smtpd,imapd,dhcpd,smbd,sshd
指定された時間にプログラムを起動する機能を提供するもの
crond
サーバー設定 アクセスできるようにするには
今virtualboxにCentOS7を入れてそこにSSHで接続しようと試みているけどできない。
そこを突破したい。
virtualboxのアダプターはブリッジアダプター。
PSコマンドはプロセスの動作状況を確認するためのコマンド。
/etc/rc.d/init.d/sshd startと入力してもそのようなファイルやディレクトリはないと出てしまう。実際ディレクトリinit.dには
functions netconsole network README しかない。sshdは存在してなかった。
cat README | less した結果、いかの文章があった。
’’’
/etc/rc.d/init.d/に伝統的な(今まで使ってきた)initスクリプトを探していませんか?そしてそれらがどこかに行ってしまっていると。
ここに今どうなっているのか説明します。
native systemd service filesによってinit スクリプトが置き換えられた OSをあなたは使っています。このservice filesはinitスクリプトにとても良く似た機能を提供しています。
このservice filesを利用するには、単純にsystemctlをよびだすこと。そしてそれは(直近に?)起動しているすべてのservice(他のunitも)の一覧をアウトプットします。
また次のものがほしければsystemctl list-unit-filesを使いなさい。
stopped,disabled,masked の状態を含めたすべてのunit filesのリスト
各々サービス(service)をstart ,stop するときには以下のコマンドを使います。
systemctl start foobar.service
systemctl stop foobar.service
更に詳しいことはsystemctl(1)を参照してください。
注意。。。。省略
systemctl(1)
systemd(1)
http://0pointer.de/blog/projects/systemd-for-admins-3.html
http://www.freedesktop.org/wiki/Software/systemd/Incompatibiities
やり方が分かってきた。
ssh接続するには、ssh用のデーモン(サービス)を起動する必要がある。
そしてlinux系のデーモンは最後にdがつく。だからサーバーにsshdを起動させれば良いと思う。そしてCentOS 7からはsystemctl を使う。具体的には
systemctl start foobar.service これでサーバーにデーモンを起動させることができる。
デーモンの起動したかどうかの確認のコマンドは
systemctl status foobar.service
あとは実際にssh のあとにIPを入れるので、サーバーにそのIPを設定してやればいいわけだ。
具体的にデーモンの稼働は、
systemctl start sshd.service
systemctl status sshd.service
デーモンの自動起動
systemctl enable sshd.service
IPの変更
nmcli connection modify [device-name] ipv4.adrresses "x.x.x.x/x x.x.x.x"
ネットワークの自動接続
nmcli connection modify [device-name ] connection.autoconnect "yes"
ちなみにIPの変更してから起動させるべきか、デーモンを起動させてからIPを変更しても大丈夫なのかまだ確認できていない。
linux 良さげなリンク
Linux Networking-concepts HOWTO
Linux Networking-concepts HOWTO
Linux Networking-HOWTO
https://www.tldp.org/HOWTO/NET3-4-HOWTO.html